Você está na página 1de 690

Copyright © 2020 by Uirá Ribeiro

Todos os Direitos Reservados

Certificação CompTIA Linux+

Guia Completo para o Exame XK0-004

Uirá Ribeiro

ISBN 978-85-921455-4-5

Esta có pia deste Livro está licenciada exclusivamente para:

Roque Laécio dos Santos Souza


90587243520
rlaecio@hotmail.com
+351 938580313

Este livro e todo seu conteúdo é protegido pela Lei de Direitos Autorais - LEI Nº 9.610, de 19
de Fevereiro de 1998. Este livro e suas partes não poderão ser reproduzidos / distribuídos /
copiados / cedidos / vendidos / emprestados sem a autorização pré via e por escrito do autor,
sob pena da adoção das medidas cabı́veis na esfera cı́vel e penal.

Os conceitos emitidos neste livro sã o de inteira responsabilidade do Autor.

Apesar de toda a atenção, erros de digitação e/ou de impressã o nã o sã o descartados. Em
caso de alguma dú vida, entre em contato conosco pelo e-mail uribeiro@gmail.com para que
possamos ajudá -lo.

O Autor se exclui de quaisquer responsabilidades por eventuais perdas ou danos a pessoas


ou bens por uso deste livro.
Agradecimentos

O paradoxo dos agradecimentos é quase impossível de ser completo e aceitavelmente breve.

No sagrado mistério da vida, cada coração possui no Infinito a alma gêmea da sua,
companheira divina para a viagem à gloriosa imortalidade. Agradeço à minha alma de
minhalma Carla Cruz, por tecer-me a felicidade em sorrisos de esplendor.

Ao meu “pequeno” grande amigo, meu filho, Arthur. Que torna todos os momentos mais
doces e engraçados.

Aos meus pais que me ensinaram e deram-me muito mais do que podia pedir.

Ao amigo Jon “Maddog” Hall, que tão gentilmente me honrou ao escrever o prefácio deste
livro.

Ao amigo Leonard Wadewitz, pela parceria com a CompTIA.

Aos milhares de programadores e pessoas que dão o melhor de si ao desenvolverem


soluções OpenSource adequadas, tornando a vida em sociedade cada vez melhor.

Ao companheirismo e apoio das diversas pessoas que foram cruciais em diversas ocasiões, a
minha gratidão.

A Deus, pela força, pela saúde, pelo pão nosso de cada dia e pela fé.

Uirá Endy Ribeiro

Belo Horizonte, 12 de Janeiro de 2020


Sobre o Autor

Se colocarmos todos os sistemas e linguagens em que prof. Uirá Ribeiro é fluente, você terá
a certeza de que ele é um Jedi. Vamos deixar você na dúvida dizendo apenas que ele é
Mestre em Sistemas distribuídos, especialista em telecomunicações, redes de comutação de
pacotes, Voz sobreIP, gateways de acesso remoto, gatekeepers. A sopa de letrinhas você
encontra nas buscas on-line.

Se buscar, vai descobrir também que Uirá une duas paixões em suas atividades: TI e
educação. A aventura que começou como diretor de TI de nove campi o levou a assumir a
Direção geral da Universidade Salgado de Oliveira em Belo Horizonte.

Achando que era pouco, o nosso autor continuou se dedicando ao site


www.certificacaolinux.com.br, com vários cursos OpenSource e preparatório para os exames
da LPI e CompTIA.

A Força permite que ele durma pouco, de forma que ainda consegue tempo para alimentar o
hábito de cozinhar e viver inventando soluções – a última foi uma câmera de segurança
criada com um computador de 8 dólares rodando Linux!

Enquanto restaura a paz na república, mantém seus penguins alimentados e saudáveis


desde 1998, e aprenderam a voar nas "núvens" já faz tempo.

Também é autor do livro “Sistemas Distribuídos: desenvolvendo aplicações de alta


performance no Linux”, “Metodologia Científica: teoria e prática”, “TCC – Trabalho de
Conclusão de Curso”, "Certificação Linux", "Certificação Linux para LPIC-101", "Certificação
Linux para LPIC-102" e “37 Hábitos dos Professores Altamente Eficazes”.

E assim, entre invenções, linguagens e delícias, o prof. Uirá divide com você o conhecimento
para o treinamento Jedi em Certificação CompTIA Linux+ nessas páginas.
Prefácio

Saudações,

Se você está lendo estas palavras, é porque você, provavelmente, tomou várias decisões.

Em primeiro lugar, você, provavelmente, conhece algo sobre o movimento de Software Livre
no Brasil, e sua importância para a economia de seu país. Você, provavelmente, já percebeu
que existe uma disponibilidade de código-fonte de projetos como GNU e o Linux Kernel,
através dos quais você pode adequar o sistema operacional para melhor se enquadrar às
suas necessidades ou às necessidades de seu empregador.

Em segundo lugar, você pode estar usando Linux em seu PC em casa, ou talvez você seja um
administrador de um sistema como Solaris, AIX, HP/UX, ou algum outro sistema de
propriedade Unix e, logo, você começou a usar Linux no trabalho. Ou ainda, você se sente
pronto para trabalhar em uma empresa que trabalha com o sistema Linux em tempo integral.

Em terceiro lugar, você pode ter olhado em um jornal e percebeu que alguns anúncios de
emprego já estão exigindo que o candidato tenha “Certificação em Linux”, e você deseja
saber o motivo de tal requisito. Afinal de contas, você já sabe como manter um sistema de
Linux!

Quando eu comecei em informática, trinta e cinco anos atrás, as coisas eram muito, mas
muito mais simples do que elas são hoje. Um programador só precisava saber como perfurar
cartões e como escrever na linguagem FORTRAN (ou COBOL). Não havia Internet ou vírus,
somente interfaces gráficas pobres, e a memória principal era medida em kilobytes, nada de
megabytes ou gigabytes. Na realidade, nem sequer existia algum título oficial para o cargo
que temos hoje de “administrador de sistemas”, uma vez que cada sistema era executado
por “operadores” que se preocupavam com uma máquina específica, e não com a
interatividade de várias máquinas que trabalham em conjunto.

Hoje, nós temos que nos preocupar com segurança, tráfico de rede e tabelas de rotas,
subnets, e demais assuntos de rede. Temos que controlar migração de dados e de programas
de um sistema para o outro, e a interoperabilidade de várias redes e protocolos. Nós temos
que ser capazes de planejar o crescimento, além de resolver problemas. É a partir dessas
necessidades que se originaram as tarefas e o título de “Administrador de Sistemas.”

Em reconhecimento ao crescimento fenomenal do sistema operacional GNU/ Linux, o Linux


Professional Institute, uma organização sem fins lucrativos sediada no Canadá, estipulou uma
série de qualificações que um administrador de sistemas Linux deve possuir. Eles também
criaram testes com o intuito de verificar se essas atribuições são dominadas pelo
administrador em questão.

Assim, se o administrador dominar uma média predefinida desses requisitos, então ele,
provavelmente, possui o conhecimento necessário para administrar sistemas de GNU/Linux.
Mantendo o espírito de Software Livre, o instituto publicou os objetivos dos testes em seu
site, de modo que diferentes métodos de estudo podem ser desenvolvidos.
Este livro é um exemplo de um método de treinamento para lhe ajudar a alcançar este nível
de conhecimento.

O conhecimento de sistemas de GNU/Linux por si só não desenvolve um mestre em


administração de sistemas, mas, para o gerente que está contratando, ter alguém que
passou no teste de uma certificação em Linux lhe dá a segurança de que o mesmo está
contratando um administrador com um desempenho adicional e medido através da
certificação.

Claro que o contratante também pode conferir o potencial do candidato com seus ex-
empregadores ou professores. E por que também não verificar as realizações prévias do
empregado como listado em seu currículo? Mas o fato do candidato ter sido aprovado nos
exames de uma certificação assegura para o empregador que o candidato em questão, com
certeza, se trata de um BOM administrador de sistemas GNU/Linux.

Para aqueles que desejam estudar e desenvolver uma carreira em Administração de


Sistemas, por favor, sinta-se seguro ao utilizar os objetivos listados para o exame e os veja
como um bom guia de estudo com as informações que você deve saber. Pois eles foram
desenvolvidos para administradores de sistemas e por administradores de sistemas. Assim,
mesmo que você não tenha a intenção de fazer os exames de CompTIA formalmente, saiba
que este material lhe tornará um melhor administrador de sistemas.

Finalmente, dê as boas-vindas a este livro, pois se trata de um guia relativamente barato


para estudar e alcançar a sua meta de se tornar um administrador de sistemas GNU/Linux
certificado.

Não será o fim de sua aprendizagem, mas um BOM começo.

Meus cumprimentos,

Jon “Maddog” Hall

Diretor executivo Linux International


Como aproveitar este livro ao
máximo
Uma vez que o exame CompTIA Linux+ recomenda que os candidatos tenham certa
experiência no Linux, optamos por seguir a exata sequência dos tópicos do exame elencados
no site da CompTIA. Isto facilita muito a consulta dos temas para quem está se preparando
para prestar o exame

Este livro possui uma série de exemplos de comandos. Convencionou-se que os comandos
que iniciam com "$" são aqueles que podem ser executados com um usuário comum no
Linux.

Já os comandos que iniciam com "#", são aqueles que precisam de permissões do super-
usuário root para serem executados. Portanto, se você for testar estes comandos, você
precisa estar logado como root, ou então usar o comando "sudo" antes do comando indicado
no exemplo.

Alguns comandos podem aceitar algum parâmetro ou opção como opcional. Quando isso
acontecer, o livro vai apresentar o parâmetro entre colchetes [ ] para indicar que é opcional.

É possível que ao tentar rodar um determinado comando ou ver o conteúdo de um


determinado arquivo você depare com algum erro. Isto é porque nem todos os comandos ou
arquivos podem estar instalados como padrão na distribuição Linux que você escolheu para
estudos. Isto não significa que o livro está errado, ou que o comando não existe, mas
simplesmente que o comando ou arquivo em questão não está instalado. Então você deve
instalar o software usando o gerenciador de pacotes adotado pela distribuição que você está
utilizando.

Também é possível que haja pequenas variações nos caminhos dos arquivos indicados no
livro. Isto é um problema oriundo da distribuição que você escolheu que não seguiu o padrão
definido pelo Linux Standard Base (LBL).

Como a prova da CompTIA Linux+ é neutra, ela segue naturalmente o padrão Linux Standard
Base, que é o indicado para as distribuições seguirem. Este livro usa as convenções adotadas
pela CompTIA e a Linux Stardard Base.

Este livro também tem vídeos sobre os comandos exemplificados, para você ver o uso do
comando em questão em ação. Para ver os vídeos use seu celular com o aplicativo da
câmera ou aplicativo de ler QR-Code.
Certificação CompTIA Linux+

Sumário

Agradecimentos ......................................................................................................................... iii


Sobre o Autor ............................................................................................................................. iv
Prefácio ........................................................................................................................................ v
Como aproveitar este livro ao máximo ................................................................................. vii
Como se preparar para o exame ............................................................................................. 1
Como Marcar a Prova? ....................................................................................................... 4
Onde encontrar um Centro PearsonVue? ........................................................................ 4
Como é o ambiente da prova? ......................................................................................... 4
A Importância de Fazer Exercícios ................................................................................... 5
Aprendendo de Acordo com o Funcionamento do seu Cérebro .................................. 5
Físico ............................................................................................................................... 5
Linguístico / Sonoro ......................................................................................................... 6
Visual ............................................................................................................................... 6
Mapas Mentais .................................................................................................................... 7
Flashcards ............................................................................................................................ 8
Você Precisa Fazer Simulados! ......................................................................................... 8
Aulas dos Comandos ........................................................................................................... 9
Um Linux para você na Web ............................................................................................ 10
Grupo de Estudos no Telegram ...................................................................................... 11
Desconto Acadêmico pra quem é da America Latina e Caribe .................................. 12
Hardware e Configuração do Sistema .................................................................................. 13
1.1 Conceitos do Processo de Boot do Linux ....................................................................... 15
Processo de Carga do Kernel ................................................................................................. 16
Gerenciador de Boot ................................................................................................................ 17
Instalando um Gerenciador de Boot ..................................................................................... 21
Grand Unified Boot Loader (GRUB Legado - 1) ................................................................... 21
initramfs .................................................................................................................................... 23
mkinitrd ......................................................................................................................... 24
dracut ............................................................................................................................ 24
vmlinuz ...................................................................................................................................... 24
grub-install ................................................................................................................................ 24
Grand Unified Boot Loader (GRUB – 2) ................................................................................. 25
Principais Mudanças do Grub 1 para o Grub 2 ............................................................... 26
/etc/default/grub ............................................................................................................ 26
GRUB_DEFAULT ............................................................................................................. 27
GRUB_SAVEDEFAULT ..................................................................................................... 27
GRUB_HIDDEN_TIMEOUT ............................................................................................... 27
GRUB_HIDDEN_TIMEOUT_QUIET .................................................................................... 27
GRUB_TIMEOUT ............................................................................................................. 27
GRUB_DISTRIBUTOR ...................................................................................................... 28
GRUB_CMDLINE_LINUX_DEFAULT .................................................................................. 28
GRUB_CMDLINE_LINUX .................................................................................................. 28
GRUB_TERMINAL ............................................................................................................ 28

ix
Prof. Uirá Ribeiro

GRUB_GFXMODE ............................................................................................................ 28
GRUB_DISABLE_LINUX_RECOVERY ................................................................................ 28
GRUB_INIT_TUNE ........................................................................................................... 28
/etc/grub.d ..................................................................................................................... 28
00_header ...................................................................................................................... 29
05_debian_theme .......................................................................................................... 29
10_hurd ......................................................................................................................... 29
10_linux ......................................................................................................................... 29
20_memtest86+ ............................................................................................................ 29
30_os-prober ................................................................................................................. 29
40_custom ..................................................................................................................... 29
Instalar novos Sistemas ou Imagens de Kernel ............................................................. 29
Interação com o Grub .................................................................................................... 30
Nomes das Partições no Grub 2 ..................................................................................... 30
Outros gerenciadores de boot ............................................................................................... 30
SYSLINUX ....................................................................................................................... 30
EXTLINUX ....................................................................................................................... 30
ISOLINUX ....................................................................................................................... 30
PXELINUX ....................................................................................................................... 31
Kernel Panic! ............................................................................................................................ 31
Falha no Kernel .............................................................................................................. 31
Single-User .................................................................................................................... 31
Passando parâmetros do Kernel .................................................................................... 32
Falha de Disco ............................................................................................................... 32
1.2 Instalar, Configurar e Monitorar Módulos do Kernel ................................................... 33
lsmod .......................................................................................................................................... 34
modprobe .................................................................................................................................. 35
insmod ....................................................................................................................................... 35
rmmod ........................................................................................................................................ 36
modinfo ...................................................................................................................................... 36
depmod ...................................................................................................................................... 37
dmesg ........................................................................................................................................ 38
1.3 Configurar e verificar parâmetros de conexão de rede .............................................. 40
Configurando Wifi .......................................................................................................... 42
iwconfig ......................................................................................................................... 42
iwlist .............................................................................................................................. 42
Resolução de Nomes ............................................................................................................... 42
/etc/hostname ............................................................................................................... 43
/etc/hosts ....................................................................................................................... 43
/etc/resolv.conf .............................................................................................................. 43
/etc/nsswitch.conf .......................................................................................................... 44
Configurar o Cliente DNS ........................................................................................................ 44
Network Manager ..................................................................................................................... 47
nmcli .............................................................................................................................. 47
ip ................................................................................................................................................. 51

x
Certificação CompTIA Linux+

Tabela de Rotas ........................................................................................................................ 54


route ........................................................................................................................................... 55
Ferramentas de Diagnóstico .................................................................................................. 56
ping e ping6 .............................................................................................................................. 57
netstat ....................................................................................................................................... 58
ss ................................................................................................................................................ 60
host ............................................................................................................................................ 62
dig ............................................................................................................................................... 63
nslookup .................................................................................................................................... 64
ethtool ....................................................................................................................................... 66
Sintonia Fina na Rede ............................................................................................................. 67
Ligação ....................................................................................................................................... 69
Balanceamento de Carga .............................................................................................. 69
Agregação ..................................................................................................................... 69
Ativa/Passiva ................................................................................................................. 69
Ponte .......................................................................................................................................... 70
1.4 Gerenciar Armazenamento no Linux .............................................................................. 71
Layout do Disco ........................................................................................................................ 71
Partições .................................................................................................................................... 74
Master Boot Record - MBR ...................................................................................................... 74
GUID Partition Table (GPT) ..................................................................................................... 77
Partições e Sistemas de Arquivos no Linux ......................................................................... 77
Tipos de Partições ......................................................................................................... 80
Partições Primá rias ........................................................................................................ 80
Partições Estendidas ..................................................................................................... 81
Partições Ló gicas ........................................................................................................... 81
Partição de Swap (arquivo de troca) .............................................................................. 81
Sistemas de Arquivos .............................................................................................................. 82
ext2 ............................................................................................................................... 82
ext3 ............................................................................................................................... 82
ext4 ............................................................................................................................... 83
XFS ................................................................................................................................ 83
Reiserfs v3 ..................................................................................................................... 84
VFAT .............................................................................................................................. 84
BTRFS ............................................................................................................................ 84
NFS ................................................................................................................................ 85
SMB ............................................................................................................................... 85
CIFS ............................................................................................................................... 86
Multipath ................................................................................................................................... 86
Criando Partições ..................................................................................................................... 86
fdisk ............................................................................................................................................ 86
parted ........................................................................................................................................ 90
gdisk ........................................................................................................................................... 92
Criando Sistemas de Arquivos ............................................................................................... 93

xi
Prof. Uirá Ribeiro

mkfs ............................................................................................................................................ 94
Filesystem Hierarchy Standard ............................................................................................. 97
/ ..................................................................................................................................... 98
/bin ............................................................................................................................... 98
/boot .............................................................................................................................. 98
/dev ............................................................................................................................... 98
/etc ................................................................................................................................ 99
/home ............................................................................................................................ 99
/lib ................................................................................................................................. 99
/mnt ............................................................................................................................... 99
/media ........................................................................................................................... 99
/proc .............................................................................................................................. 99
/opt ................................................................................................................................ 99
/root ............................................................................................................................. 100
/run .............................................................................................................................. 100
/sbin ............................................................................................................................. 100
/tmp ............................................................................................................................. 100
/usr .............................................................................................................................. 100
/var .............................................................................................................................. 101
Integridade do Sistema de Arquivos .................................................................................. 101
Monitorar as estatísticas dos discos ............................................................................ 101
Monitorar o Espaço Livre ............................................................................................. 102
df ............................................................................................................................................... 102
du .............................................................................................................................................. 103
Reparar o Sistema de Arquivos ........................................................................................... 105
fsck ........................................................................................................................................... 105
e2fsck ....................................................................................................................................... 107
debugfs .................................................................................................................................... 107
dumpe2fs ................................................................................................................................. 108
resize2fs .................................................................................................................................. 108
e2label ..................................................................................................................................... 109
xfs_repair ................................................................................................................................. 110
xfs_fsr ....................................................................................................................................... 111
tune2fs ..................................................................................................................................... 112
xfs_db ....................................................................................................................................... 113
Montando e Desmontando Sistemas de Arquivos ............................................................ 114
mount ....................................................................................................................................... 115
/etc/mtab ..................................................................................................................... 118
umount .................................................................................................................................... 118
lsblk .......................................................................................................................................... 119
blkid ......................................................................................................................................... 121
/etc/fstab ................................................................................................................................. 121
Logical Volume Manager - LVM ........................................................................................... 123
Terminologia do LVM ................................................................................................... 125

xii
Certificação CompTIA Linux+

Passo a passo para trabalhar com o LVM .................................................................... 125


Criando partições LVM ................................................................................................. 125
Incializando volumes físicos ........................................................................................ 125
Criando um volume group ........................................................................................... 126
Ativando um volume group ......................................................................................... 126
Criando volumes lógicos .............................................................................................. 126
Ativando o volume lógico ............................................................................................ 126
Formatando o volume lógico ....................................................................................... 127
Aumentando o tamanho do volume com um disco novo ............................................. 127
Software RAID ........................................................................................................................ 128
mdadm ........................................................................................................................ 129
1.5 - Conceitos e tecnologias de Núvem e Virtualização ................................................. 131
Virtualização como motor da inovação ........................................................................ 132
Como a virtualização funciona ..................................................................................... 132
Tipos de Hypervisor ..................................................................................................... 133
Tipos de Máquinas Virtuais: VMs x para-virtuais x Drivers .......................................... 133
Templates de Hypervisor ............................................................................................. 133
Compatibilidade de hardware ...................................................................................... 134
Softwares de Virtualização Completa ......................................................................... 134
Criação, Migração e Cópia (Bootstrapping) ................................................................. 135
Gerenciamento de Máquinas Virtuais .......................................................................... 136
Cloud-Init ..................................................................................................................... 136
Kickstart com Anaconda .............................................................................................. 136
Grandes Players de Cloud Computing ......................................................................... 137
Modelos de Computação em Nuvem ........................................................................... 137
Infraestrutura como Serviço (IaaS) .............................................................................. 137
Plataforma como Serviço (PaaS) .................................................................................. 138
Software como Serviço (SaaS) ..................................................................................... 138
Armazenamento em Máquinas Virtuais ...................................................................... 139
Rede em Máquinas Virtuais ........................................................................................... 139
Virtualização em Contêineres .............................................................................................. 140
DevOps e Contêineres ................................................................................................. 141
Contêiner são VM's? .................................................................................................... 141
Software para Conteineres ............................................................................................ 142
LXC .............................................................................................................................. 142
Docker ......................................................................................................................... 142
Ferramentas de VM ............................................................................................................... 143
Libvirt .......................................................................................................................... 143
Virsh ............................................................................................................................ 143
VMM ............................................................................................................................. 143
1.6 – Configurar as Opções de Localização ........................................................................ 144
Configurando as Zonas de Fuso Horário ...................................................................... 144
/usr/share/zoneinfo ...................................................................................................... 144
/etc/localtime .......................................................................................................................... 145
/etc/timezone ............................................................................................................... 145
Variável TZ .................................................................................................................. 145
tzselect .................................................................................................................................... 146

xiii
Prof. Uirá Ribeiro

date .......................................................................................................................................... 148


hwclock .................................................................................................................................... 150
timedatectl .............................................................................................................................. 151
Variáveis de Localização ....................................................................................................... 152
locale ........................................................................................................................... 153
localectl ....................................................................................................................... 154
Padrões de Caractere ............................................................................................................ 155
ASCII ............................................................................................................................ 155
ISO-8859 ...................................................................................................................... 156
..................................................................................................................................... 157
UNICODE ...................................................................................................................... 157
................................................................................................................................................... 158
Operação e Manutenção de Sistemas ................................................................................ 159
2.1 Fazer as instalações, configurações, atualizações e remoções de software ......... 161
Compiladores .......................................................................................................................... 161
GCC ............................................................................................................................. 162
PRÉ-PROCESSAMENTO ................................................................................................. 162
COMPILAÇÃO ............................................................................................................... 163
ASSEMBLER ................................................................................................................. 164
LINKER ......................................................................................................................... 164
Baixando o Código Fonte ............................................................................................. 166
wget ............................................................................................................................ 166
cURL ............................................................................................................................ 166
Arquivos tarball ...................................................................................................................... 167
Compilando Software ............................................................................................................ 170
configure ..................................................................................................................... 170
Makefile ....................................................................................................................... 171
make ........................................................................................................................... 171
Gerenciamento de Bibliotecas Compartilhadas ................................................................ 172
ldd ............................................................................................................................................. 174
ldconfig .................................................................................................................................... 175
LD_LIBRARY_PATH .................................................................................................................. 175
Gerenciamento de Pacotes Debian ..................................................................................... 176
dpkg ......................................................................................................................................... 178
dpkg-reconfigure .................................................................................................................... 180
apt-get ..................................................................................................................................... 180
apt-cache ................................................................................................................................. 182
Repositórios no Debian ......................................................................................................... 183
Adicionando um repositório ......................................................................................... 184
Gerenciamento de Arquivos Red Hat e YUM ..................................................................... 185
rpm ........................................................................................................................................... 186
yum ........................................................................................................................................... 191
Repositórios no Yum .................................................................................................... 192
dnf ............................................................................................................................................ 197

xiv
Certificação CompTIA Linux+

zypper ...................................................................................................................................... 198


2.2 Gerenciando Usuários e Grupos e Arquivos Relacionados ....................................... 200
/etc/passwd ................................................................................................................. 200
/etc/shadow ................................................................................................................. 201
/etc/group .................................................................................................................... 203
skel ........................................................................................................................................... 204
useradd .................................................................................................................................... 204
usermod ................................................................................................................................... 206
userdel ..................................................................................................................................... 207
passwd ..................................................................................................................................... 207
chage ........................................................................................................................................ 209
groupadd ................................................................................................................................. 211
groupdel .................................................................................................................................. 211
groupmod ................................................................................................................................ 212
getent ...................................................................................................................................... 212
Gerenciamento de Senhas .................................................................................................... 213
Identificando Qual Usuário Está Conectado ou Última Conexão .................................... 214
last ..................................................................................................................................... 214
id ........................................................................................................................................ 215
whoami ............................................................................................................................. 215
who ........................................................................................................................................... 216
w ............................................................................................................................................... 216
Arquivos de Configuração do Bash e Perfil ........................................................................ 216
/etc/profile ................................................................................................................... 217
/etc/profile.d ................................................................................................................ 217
/etc/bashrc ou /etc/bash.bashrc ................................................................................... 217
~/.bash_profile ............................................................................................................ 217
~/.bash_login ............................................................................................................... 217
~/.profile ..................................................................................................................... 217
~/.bashrc ..................................................................................................................... 217
~/.bash_logout ............................................................................................................ 217
Ajustando o Ambiente de Trabalho dos Usuários ............................................................. 220
Trabalhando com Cotas ........................................................................................................ 220
Tipos de Limite de Cota ............................................................................................... 222
Período de Graça ......................................................................................................... 223
Gerenciamento de Cotas ............................................................................................. 223
quota ........................................................................................................................................ 223
quotaon ................................................................................................................................... 224
quotaoff ................................................................................................................................... 224
quotacheck .............................................................................................................................. 225
edquota ................................................................................................................................... 225
repquota .................................................................................................................................. 226
2.3 Crie, modifique e redirecione arquivos ....................................................................... 228
Editor de Textos vi/vim ......................................................................................................... 228

xv
Prof. Uirá Ribeiro

nano ......................................................................................................................................... 230


Processando fluxos de texto usando filtros ...................................................................... 231
Procurar por Arquivos Texto Usando Expressões Regulares .......................................... 232
Conceitos Básicos ........................................................................................................ 232
Alternância .................................................................................................................. 232
Agrupamento ............................................................................................................... 232
Quantificação (ou repetição) ....................................................................................... 232
POSIX ........................................................................................................................... 233
BRE: expressões regulares básicas ............................................................................. 233
ERE: expressões regulares estendidas ........................................................................ 234
Classes de caracteres .................................................................................................. 234
grep .......................................................................................................................................... 235
egrep ........................................................................................................................................ 238
fgrep ......................................................................................................................................... 238
cat ............................................................................................................................................. 239
tail ............................................................................................................................................ 240
head ......................................................................................................................................... 240
less ........................................................................................................................................... 241
more ......................................................................................................................................... 241
Fluxos de Dados, Condutores e Redirecionamentos ........................................................ 242
xargs ........................................................................................................................................ 247
tee ............................................................................................................................................ 248
tr ............................................................................................................................................... 249
echo .......................................................................................................................................... 249
sort ........................................................................................................................................... 250
awk ........................................................................................................................................... 252
sed ............................................................................................................................................ 253
cut ............................................................................................................................................. 256
printf ........................................................................................................................................ 257
wc ............................................................................................................................................. 257
paste ........................................................................................................................................ 258
Operações com Arquivos e Diretórios ................................................................................ 259
touch ........................................................................................................................................ 259
ls ............................................................................................................................................... 261
file ............................................................................................................................................. 262
Uso de coringas ...................................................................................................................... 263
cp .............................................................................................................................................. 264
mv ............................................................................................................................................. 265
rm ............................................................................................................................................. 266
mkdir ........................................................................................................................................ 267
rmdir ........................................................................................................................................ 267
unlink ....................................................................................................................................... 268
diff ............................................................................................................................................ 269

xvi
Certificação CompTIA Linux+

Localizando Arquivos ............................................................................................................. 269


find ........................................................................................................................................... 270
locate ....................................................................................................................................... 271
updatedb ................................................................................................................................. 272
whereis .................................................................................................................................... 272
which ........................................................................................................................................ 272
Links Simbólicos e Hard Links ............................................................................................. 273
Links Simbólicos .......................................................................................................... 273
Hard Links ou Links Físicos .......................................................................................... 273
ln ............................................................................................................................................... 274
Cópia Remota de Arquivos ................................................................................................... 275
scp ............................................................................................................................................ 275
rsync ......................................................................................................................................... 276
2.4 Gerencia de Serviços ...................................................................................................... 278
System V Init Daemon ........................................................................................................... 278
Runlevels ................................................................................................................................. 279
Definindo Quais Processos Serão Executados por Cada runlevel .................................. 280
chkconfig ................................................................................................................................. 281
service ..................................................................................................................................... 282
Definindo o Runlevel Padrão ................................................................................................ 284
Comandos auxiliares ................................................................................................... 284
shutdown ................................................................................................................................. 285
Control-Alt-Del ............................................................................................................. 285
Desvantagens do System V init Daemon ........................................................................... 286
Systemd ................................................................................................................................... 286
Modo de Emergência e Resgate .................................................................................. 288
Rescue.target .............................................................................................................. 288
Emergency.target ........................................................................................................ 288
systemctl ................................................................................................................................. 288
Systemd Mount Units ............................................................................................................ 293
hostnamectl ............................................................................................................................ 293
systemd-analyze .................................................................................................................... 295
Comparação entre System V e Systemd ............................................................................ 296
2.5 Linux como Servidor ....................................................................................................... 297
Protocolos e Portas de Comunicação ........................................................................... 298
Servidores Web ........................................................................................................... 299
Apache HTTP Server .................................................................................................... 299
NGINX .......................................................................................................................... 299
Servidores de Banco de Dados .................................................................................... 299
Oracle Database .......................................................................................................... 299
MySQL ......................................................................................................................... 299
PostgreSQL .................................................................................................................. 300
MongoDB ..................................................................................................................... 300
Servidores de E-Mail .................................................................................................... 300

xvii
Prof. Uirá Ribeiro

NTP - Network Time Protocol ....................................................................................... 300


DHCP - Dynamic Host Configuration Protocol .............................................................. 301
DNS - Resolução de Nomes ......................................................................................... 301
Servidor de Arquivos ................................................................................................... 301
Servidores de Impressão ............................................................................................. 301
Web Proxy e Cachê ...................................................................................................... 301
Autenticação ................................................................................................................ 302
Keberos ....................................................................................................................... 302
SAMBA ......................................................................................................................... 302
LDAP ............................................................................................................................ 302
VPN - Virtual Private Network ...................................................................................... 302
Monitoramento ............................................................................................................ 303
Logging ........................................................................................................................ 303
Autoridade de Certificado ............................................................................................ 303
SSH - Secure Shell ....................................................................................................... 304
Clustering .................................................................................................................... 304
Balanceamento de Carga ............................................................................................ 304
Conteineres ................................................................................................................. 304
2.6 Automatizar e Agendar Trabalhos no Linux ................................................................ 305
cron .......................................................................................................................................... 305
crontab ........................................................................................................................ 307
Permissões do Cron ..................................................................................................... 308
/etc/cron.allow ............................................................................................................. 308
/etc/cron.deny ............................................................................................................. 308
Diretórios Especiais do Cron ........................................................................................ 308
/etc/cron.d ................................................................................................................... 308
/etc/cron.{daily, hourly, weekly, monthly} .................................................................. 309
at ............................................................................................................................................... 310
atq ............................................................................................................................... 311
atrm ............................................................................................................................. 312
Permissões do at ......................................................................................................... 312
Multitarefa: Processos em Primeiro e Segundo Planos ................................................... 312
Sinais ........................................................................................................................................ 313
kill ............................................................................................................................................. 314
Multitarefa: processos em segundo plano e processos em primeiro plano ................. 315
Processos em primeiro plano (Foreground) ................................................................. 315
Processos em segundo plano (Background) ................................................................ 316
& .................................................................................................................................. 316
Controle de Processos ................................................................................................. 316
bg .............................................................................................................................................. 317
fg ............................................................................................................................................... 317
jobs ........................................................................................................................................... 318
nohup ....................................................................................................................................... 319
2.7 Operação de dispositivos Linux .................................................................................... 320
SYSFS ....................................................................................................................................... 320
BLOCK .......................................................................................................................... 321

xviii
Certificação CompTIA Linux+

BUS .............................................................................................................................. 321


CLASS .......................................................................................................................... 321
DEVICES ....................................................................................................................... 321
FIRMWARE ................................................................................................................... 321
FS ................................................................................................................................ 321
MODULE ....................................................................................................................... 321
POWER ......................................................................................................................... 322
HALD ........................................................................................................................................ 322
UDEV ........................................................................................................................................ 322
Mapper ........................................................................................................................ 323
Hotplug x Coldplug ................................................................................................................ 323
udevadm ..................................................................................................................... 324
Informações de Hardware no diretório /proc .................................................................... 325
Configurações de Hardware ................................................................................................. 326
Requisição de Interrupção (IRQ) ......................................................................................... 327
Portas de Entrada/Saída IO (Input / Output) ..................................................................... 327
Acesso Direto a Memória (DMA) .......................................................................................... 328
Dispositivos de Armazenamento ......................................................................................... 330
Configurando Dispositivos PCI ............................................................................................. 331
lspci .......................................................................................................................................... 331
lsdev ......................................................................................................................................... 333
Configurando Dispositivos USB ........................................................................................... 333
Teclado ........................................................................................................................ 335
Mouse .......................................................................................................................... 335
Impressora ................................................................................................................... 335
Webcam ...................................................................................................................... 335
Outros Dispositivos ...................................................................................................... 336
Ferramentas Para Configuração de Dispositivos USB .............................................. 336
usbmgr ........................................................................................................................ 336
hotplug ........................................................................................................................ 336
lsusb ......................................................................................................................................... 337
Buffer de Mensagens do Kernel ........................................................................................... 337
GPIO ......................................................................................................................................... 338
Impressoras e Impressão no Linux ..................................................................................... 339
Gerenciamento de Impressoras ................................................................................... 340
Instalando uma Impressora manualmente .................................................................. 341
Comandos da Interface Legada do Cups ..................................................................... 342
lp ................................................................................................................................. 342
lpq ............................................................................................................................... 343
lprm ............................................................................................................................. 343
lpc ................................................................................................................................ 343
Imprimindo Arquivos ................................................................................................... 345
lpr ................................................................................................................................ 345
Instalando Impressoras Remotas em Linux ................................................................. 346
Instalando Impressoras Remotas em Windows ........................................................... 346

xix
Prof. Uirá Ribeiro

2.8 Interface Gráfica e Acessibilidade ................................................................................ 348


Arquitetura do X.org .................................................................................................... 348
Window Manager ......................................................................................................... 349
Display Manager .......................................................................................................... 350
Selecionando um Display Manager padrão .................................................................. 351
Desktops Gráficos ........................................................................................................ 352
Instalação do X.Org ..................................................................................................... 352
Configurando o X Server .............................................................................................. 353
xorg.conf ..................................................................................................................... 354
Configurações de Layout de Teclado ........................................................................... 355
Acesso Remoto ao Servidor X Window ........................................................................ 356
xhost ............................................................................................................................ 356
Variável DISPLAY ......................................................................................................... 356
xauth ........................................................................................................................... 358
.xsession-errors ........................................................................................................... 360
Executando o X.Org ..................................................................................................... 360
Wayland ................................................................................................................................... 360
O que tem de "errado" com o X.Org? .......................................................................... 361
Desktops Gráficos .................................................................................................................. 362
KDE .............................................................................................................................. 362
GNOME ........................................................................................................................ 364
Xfce ............................................................................................................................. 366
Cinnamon .................................................................................................................... 367
Protocolos de Acesso Remoto .............................................................................................. 368
X11 .............................................................................................................................. 368
XDMCP ......................................................................................................................... 368
VNC ............................................................................................................................. 369
SPICE ........................................................................................................................... 369
RDP .............................................................................................................................. 369
NX ................................................................................................................................ 370
Acessibilidade ......................................................................................................................... 371
................................................................................................................................................... 374
Segurança ............................................................................................................................... 375
3.1 Aplique as permissões de Usuário e Propriedade ..................................................... 377
umask ....................................................................................................................................... 383
Criando novos arquivos ............................................................................................... 383
Modificando as Permissões de Arquivos ............................................................................ 384
chmod ...................................................................................................................................... 384
Alterando o Dono dos Arquivos e Grupos .......................................................................... 387
chown ....................................................................................................................................... 387
chgrp ........................................................................................................................................ 388
Controle de Listas de Acesso - ACLs ................................................................................... 389
getfacl ...................................................................................................................................... 390
setfacl ...................................................................................................................................... 391
Para Criar uma Regra ACL ........................................................................................... 391

xx
Certificação CompTIA Linux+

Para Criar uma Regra Padrão ...................................................................................... 392


Para Excluir uma Regra Específica .............................................................................. 394
Para excluir todas as regras ........................................................................................ 394
Permissões de Contexto ....................................................................................................... 395
SELinux .................................................................................................................................... 395
setenforce ................................................................................................................... 396
getenforce ................................................................................................................... 397
sestatus ....................................................................................................................... 397
Políticas do SELinux ..................................................................................................... 397
Grupos de Políticas (Módulos) ..................................................................................... 398
Interruptores ............................................................................................................... 398
Visualizar o Contexto de Segurança ............................................................................ 399
Alterando o Contexto de Segurança ............................................................................ 400
AppArmor ................................................................................................................................ 401
Iniciando o AppArmor .................................................................................................. 402
Estados dos Profiles ..................................................................................................... 402
aa-status ...................................................................................................................... 402
aa-complain ................................................................................................................. 403
aa-enforce ................................................................................................................... 403
aa-disable .................................................................................................................... 403
aa-unconfined .............................................................................................................. 403
Limitando as contas de usuário ........................................................................................... 404
ulimit ........................................................................................................................................ 404
Tipos de Limite ............................................................................................................ 404
Gerenciamento de Senhas .................................................................................................... 406
chage ........................................................................................................................................ 408
Permissões Especiais de Execução ..................................................................................... 409
SUID e SGID ................................................................................................................. 409
O Perigo do SUID e SGID ............................................................................................. 409
Kernel ignora SUID de scripts ...................................................................................... 410
Procurando por Executáveis com SUID/SGID ..................................................................... 410
Executando Programas com a Permissão de Outro Usuário ........................................... 411
sudo .......................................................................................................................................... 412
su .............................................................................................................................................. 413
sudoedit ................................................................................................................................... 414
3.2 Configurar e Implementar o Acesso e Métodos de Autenticação ............................ 416
PAM .......................................................................................................................................... 416
Políticas de Senha ....................................................................................................... 419
Bloqueio de Usuários ................................................................................................... 419
Limitando o Acesso do Root ........................................................................................ 421
Integração do PAM com LDAP ...................................................................................... 422
Criptografia de Dados ........................................................................................................... 423
Par de Chaves de Criptografia ..................................................................................... 423
Public Key Infrastructure - PKI ..................................................................................... 424
Auto-assinatura de Certificado Digital ......................................................................... 424

xxi
Prof. Uirá Ribeiro

Hashing ....................................................................................................................... 425


Assinando Transmissões com Hashing ........................................................................ 425
Secure Shell - SSH ................................................................................................................. 426
Algoritmos de Criptografia ........................................................................................... 426
Configuração do cliente OpenSSH 2 ............................................................................ 426
Autenticação sem senha ............................................................................................. 427
/etc/ssh_config ............................................................................................................. 427
Conexão Remota usando o SSH .................................................................................. 428
ssh_know_hosts ........................................................................................................... 429
OpenSSH Server .......................................................................................................... 429
sshd_config .................................................................................................................. 429
Habiltar o sshd ............................................................................................................ 430
ssh-agent e ssh-add .................................................................................................... 430
ssh-copy-id .................................................................................................................. 431
Deixando o SSHD mais Seguro .................................................................................... 432
Trocar a porta do SSH .................................................................................................. 432
Não permitir login com o Root ..................................................................................... 432
Uso de Tcpwrapper ...................................................................................................... 432
Cliente VPN ............................................................................................................................. 434
SSL/TLS ........................................................................................................................ 434
DTLS ............................................................................................................................ 435
IPSec ............................................................................................................................ 435
Instalação do Cliente VPN ........................................................................................... 435
3.3 Melhores Práticas de Segurança em Linux ................................................................. 437
Segurança de Inicialização e Acesso Físico ................................................................. 437
Acesso ao BIOS/UEFI com Senha ................................................................................. 437
Acesso ao Menu do Grub com Senha .......................................................................... 437
Desabilitar o Ctrl-Alt-Del .............................................................................................. 439
Desabilitar o uso de dispositivos de armazenamento USB .......................................... 439
Métodos de Autenticação ............................................................................................ 440
Keberos ....................................................................................................................... 440
LDAP ............................................................................................................................ 440
RADIUS ........................................................................................................................ 441
TACACS+ ..................................................................................................................... 441
Métodos de Autenticação Multifator ............................................................................ 441
Biometria ..................................................................................................................... 441
Tokens ......................................................................................................................... 442
PKI ............................................................................................................................... 442
Login sem senha .......................................................................................................... 442
Restrição de Acesso Privilegiado ................................................................................. 442
Restringir o acesso via ssh .......................................................................................... 443
Bloquear o acesso via Shell ......................................................................................... 443
Bloquear o acesso via Terminal ................................................................................... 443
Restrigindo aplicações com chroot .............................................................................. 443
Alterando o Banner do Sistema ................................................................................... 444
Desabilitando Serviços não Necessários ............................................................................ 444
Super Servidores ......................................................................................................... 445

xxii
Certificação CompTIA Linux+

/etc/xinetd.conf ............................................................................................................ 445


/etc/xinetd.d ................................................................................................................ 446
Uso de Tcpwrappers .................................................................................................... 447
hosts.allow e hosts.deny ............................................................................................. 447
Alterando as Portas Padrão ......................................................................................... 447
Restringindo acesso ao Cront e At ............................................................................... 448
Separação de Dados do Sistema e de Aplicativo .............................................................. 448
Criptografia de Disco ............................................................................................................. 449
Monitoramento e Auditoria .................................................................................................. 452
Monitoramento da Distribuição ................................................................................... 452
Monitoramento CVE ..................................................................................................... 453
Auditoria ...................................................................................................................... 453
3.4 Serviços de LOG ............................................................................................................... 455
rsyslog ......................................................................................................................... 455
rsyslog.conf ................................................................................................................. 456
syslog .......................................................................................................................... 459
syslog-ng ..................................................................................................................... 459
logger ....................................................................................................................................... 459
Rodízio de Logs com Logrotate ........................................................................................... 460
logrotate.conf .............................................................................................................. 460
Journal do Systemd ................................................................................................................ 462
journalctl ..................................................................................................................... 462
systemd-cat ................................................................................................................. 463
journald.conf ................................................................................................................ 464
Storage ........................................................................................................................ 464
Tamanho ..................................................................................................................... 464
Limpeza de Logs Antigos ............................................................................................. 465
Acesso ao Jornal sem o Systemd ................................................................................. 466
Interação do rsyslog com o jounal do systemd ............................................................ 466
3.5 Implementar e Configurar os Firewalls do Linux ....................................................... 467
Netfilter ....................................................................................................................... 470
iptables .................................................................................................................................... 470
Firewalld .................................................................................................................................. 477
UFW .......................................................................................................................................... 481
IPSet ......................................................................................................................................... 484
Regras Dinâmicas .................................................................................................................. 485
Fail2ban ................................................................................................................................... 485
DenyHosts ............................................................................................................................... 486
3.6 Backup, Restauração e Compressão de Arquivos ...................................................... 488
Tipos de Backup .......................................................................................................... 490
Backup Completo ....................................................................................................... 490
Backup Diferencial ....................................................................................................... 490
Backup Incremental ..................................................................................................... 490
Snapshots .................................................................................................................... 491
Imagens ....................................................................................................................... 491

xxiii
Prof. Uirá Ribeiro

tar ............................................................................................................................................. 491


cpio ........................................................................................................................................... 492
dd .............................................................................................................................................. 493
Fazendo Backup do Master Boot Record ..................................................................... 494
rsync ......................................................................................................................................... 495
scp ............................................................................................................................................ 495
sftp ........................................................................................................................................... 496
Verificando a Integridade ..................................................................................................... 497
sha256sum .............................................................................................................................. 497
sha512sum .............................................................................................................................. 497
md5sum ................................................................................................................................... 498
................................................................................................................................................... 498
Diagnóstico e Resolução de Problemas do Linux ............................................................. 499
4.1 Analise as Propriedades do Sistema e Corrija como corresponder ........................ 501
Classe A ....................................................................................................................... 502
Classe B ....................................................................................................................... 502
Classe C ....................................................................................................................... 502
Classe D ....................................................................................................................... 503
Classe E ....................................................................................................................... 503
CIDR ............................................................................................................................ 504
Localhost ..................................................................................................................... 505
Unix Sockets ................................................................................................................ 506
Remote Direct Access Memory - RDMA ....................................................................... 507
Redes Privadas ............................................................................................................ 507
Protocolos que Compõem o TCP/IP .............................................................................. 507
Camada de Transporte ................................................................................................ 508
TCP - Transmission Control Protocol ............................................................................ 508
UDP - User Datagram Protocol ..................................................................................... 508
IP - Internet Protocol .................................................................................................... 508
ICMP - Internet Control Message Protocol, ................................................................... 509
Serviços e Portas TCP/IP .............................................................................................. 509
Tabelas de Rotas ......................................................................................................... 511
IPv6 ................................................................................................................................... 511
Largura de Banda ........................................................................................................ 513
Taxa de Transferência ................................................................................................ 513
iperf ............................................................................................................................. 514
Saturação ou Congestão .............................................................................................. 514
Latência ....................................................................................................................... 516
TTL - Time To Live ....................................................................................................... 517
Roteadores .................................................................................................................. 517
Demora na conexão .................................................................................................... 518
Demora na resolução de nomes .................................................................................. 518
Rede local saturada ..................................................................................................... 520
Firewall saturado ......................................................................................................... 520
Roteador saturado ....................................................................................................... 520
Link da rede local para Internet saturado .................................................................... 520

xxiv
Certificação CompTIA Linux+

Tempo Esgotado .......................................................................................................... 520


Problemas de resolução de nomes .............................................................................. 521
Endereço IP incorreto .................................................................................................. 522
Serviço no host destino não funcionando .................................................................... 522
Bloqueio de Firewall .................................................................................................... 523
Congestionamento na rede ......................................................................................... 523
Ferramentas de Diagnóstico de Rede ................................................................................ 524
traceroute e traceroute6 ...................................................................................................... 524
tracepath e tracepath6 ......................................................................................................... 525
Portas Abertas com netstat, ss e lsof ................................................................................ 526
lsof ............................................................................................................................................ 527
nmap ........................................................................................................................................ 527
netcat ....................................................................................................................................... 528
iftop .......................................................................................................................................... 529
arp ............................................................................................................................................ 530
mtr ............................................................................................................................................ 531
whois ........................................................................................................................................ 532
Análise de Pacotes ................................................................................................................. 533
Wireshark .................................................................................................................... 533
tshark .......................................................................................................................... 534
tcpdump ...................................................................................................................... 534
Monitoramento e Configuração de Armazenamento ........................................................ 536
df ............................................................................................................................................... 536
du .............................................................................................................................................. 537
Estatísticas de Disco com iostat .......................................................................................... 539
ioping ........................................................................................................................... 540
Ajuste de desempenho de I/O .............................................................................................. 542
CFQ .............................................................................................................................. 542
DEADLINE .................................................................................................................... 543
NOOP ........................................................................................................................... 544
Alterando o algoritmo de E/S no Grub ......................................................................... 544
Falhas de Disco ...................................................................................................................... 545
Monitoramento e Configuração de CPU ............................................................................. 545
uptime ...................................................................................................................................... 547
sysstat ..................................................................................................................................... 548
Monitoramento e Configuração de Memória ..................................................................... 549
free ........................................................................................................................................... 550
Swap ......................................................................................................................................... 551
mkswap .................................................................................................................................... 552
vmstat ...................................................................................................................................... 553
vmstat ......................................................................................................................... 553
Out-of-Memory-Killer ............................................................................................................. 553
Ajustes no Kernel com Sysctl ............................................................................................... 554
vm.panic_on_oom ........................................................................................................ 554

xxv
Prof. Uirá Ribeiro

kernel.panic ................................................................................................................. 554


vm.swappiness ............................................................................................................ 554
Perda de Senha de Root ....................................................................................................... 555
4.2 Analise de Processos do Sistema para Otimizar o Desempenho ............................. 557
O que é um processo? ................................................................................................. 557
ps .............................................................................................................................................. 558
Usuário dono do processo (UID) .................................................................................. 562
Número de Processo - Process ID (PID) ....................................................................... 562
Processo Pai (PPID) ...................................................................................................... 562
% de CPU ..................................................................................................................... 562
% de Memória .............................................................................................................. 562
Hora de início (STIME) ................................................................................................. 562
Tempo de CPU (TIME) .................................................................................................. 562
Linha de comando (CMD) ............................................................................................ 562
Terminal (TTY) ............................................................................................................. 562
pgrep ........................................................................................................................................ 563
top ............................................................................................................................................ 564
pkill ........................................................................................................................................... 566
time .......................................................................................................................................... 566
lsof ............................................................................................................................................ 567
Situações Especiais de Erro nos Processos ....................................................................... 567
Processos Zombie ........................................................................................................ 567
Processos Órfãos ......................................................................................................... 568
Modificar a Prioridade dos Processos ................................................................................. 568
nice ........................................................................................................................................... 569
renice ....................................................................................................................................... 570
4.3 Analise e Solução de Problemas dos Usuárioss ......................................................... 572
Permissões de Arquivo ................................................................................................ 572
Permissões de Diretório ............................................................................................... 573
Criar Arquivos .............................................................................................................. 575
Apagar Arquivos .......................................................................................................... 576
Problemas de Acesso, Autenticação e Ambiente .............................................................. 576
Contas de Usuário ....................................................................................................... 576
Verificar o Log de Acesso ............................................................................................ 578
Verificar o Log de acesso mal-sucedido ....................................................................... 579
Verificar o Log do SELinux ou AppArmor ..................................................................... 580
Terminal ..................................................................................................................... 580
Interface Gráfica .......................................................................................................... 581
Acesso Remoto ............................................................................................................ 581
Tcpwrapper .................................................................................................................. 581
Netfilter ....................................................................................................................... 581
sshd_config .................................................................................................................. 582
~/.ssh .......................................................................................................................... 582
SSH no modo verbose ................................................................................................. 582
Autenticação ................................................................................................................ 582
Bloqueio com pam_tally2 e faillock ............................................................................. 583

xxvi
Certificação CompTIA Linux+

Logs de Autenticação .................................................................................................. 583


Autenticação Externa .................................................................................................. 583
4.4 Analizar e Solucionar Problemas de Aplicativos e Hardware .................................. 585
Violações do Contexto do SELinux ............................................................................... 585
Problemas de Armazenamento .................................................................................... 585
Armazenamento Degradado ........................................................................................ 585
Dispositivos Ausentes .................................................................................................. 586
Volumes ausentes ....................................................................................................... 586
Ponto de Montagem Ausente ....................................................................................... 586
Problemas de Desempenho ......................................................................................... 587
Esgotamento de Recursos ........................................................................................... 587
Integridade dos Discos ................................................................................................ 587
Discos SCSI .................................................................................................................. 587
Discos SATA ................................................................................................................. 589
RAID ............................................................................................................................ 589
Problemas com Firewall ............................................................................................... 590
Problemas de Permissão .............................................................................................. 591
Problemas de Dependência ......................................................................................... 593
Versão ......................................................................................................................... 593
Atualização de Software .............................................................................................. 594
Patching ....................................................................................................................... 594
Bibliotecas ................................................................................................................... 594
Variáveis ambientais ................................................................................................... 595
Compatibilidade com o GCC ........................................................................................ 595
Problemas com Repositórios ....................................................................................... 596
Problemas com Hardware ............................................................................................ 597
Memoria ...................................................................................................................... 597
Impressoras ................................................................................................................. 598
Vídeo ........................................................................................................................... 598
Portas de Comunicação ............................................................................................... 599
USB .............................................................................................................................. 599
Mapeamento de Teclado ............................................................................................. 599
Problemas de Compatibilidade de Hardware ou Software ........................................... 600
................................................................................................................................................... 601
Automação e Script ............................................................................................................... 602
5.1 Implemente e Execute Scripts Bash Básicos .............................................................. 603
Variáveis de Ambiente ou Globais ............................................................................... 603
PATH ............................................................................................................................ 603
HOME ........................................................................................................................... 603
USER ............................................................................................................................ 603
TERM ........................................................................................................................... 603
Variáveis locais ............................................................................................................ 604
Alterando as Variáveis de Shell ................................................................................... 606
export ....................................................................................................................................... 608
env ............................................................................................................................................ 608
set ............................................................................................................................................. 610

xxvii
Prof. Uirá Ribeiro

unset ........................................................................................................................................ 612


printenv ................................................................................................................................... 612
Customizando e Escrevendo Scripts de Shell .................................................................... 613
Escolhendo o Interpretador de Script #! shebang ........................................................... 613
Permissões de Execução ....................................................................................................... 614
Variáveis Especiais ................................................................................................................ 615
Expansões de Shell ................................................................................................................ 617
source ...................................................................................................................................... 618
O Comando test ...................................................................................................................... 620
Uso de [ ] no lugar do "test" ....................................................................................... 621
Operadores || e && ...................................................................................................... 621
if ................................................................................................................................................ 622
case .......................................................................................................................................... 623
for ............................................................................................................................................. 624
while ......................................................................................................................................... 626
until .......................................................................................................................................... 626
5.2 Controle de Versão com Git ........................................................................................... 628
Novo Projeto com o Git ................................................................................................ 628
Clonar um Projeto no Github ....................................................................................... 630
Adicionar arquivos ao Índex ........................................................................................ 630
Adicionar Arquivos ao Repositório Local ...................................................................... 631
Visualizando o Log de Alterações ................................................................................ 631
Enviando do Repositório Local para o Repositório Remoto .......................................... 631
Atualizando o Repositório Local ................................................................................... 632
Criando um Branch ...................................................................................................... 632
Mesclando um Branch ................................................................................................. 633
5.3 Processos e Conceitos de Orquestração ..................................................................... 635
DevOps ........................................................................................................................ 635
Automatização da infraestrutura ................................................................................. 636
Intraestrutura como Código ......................................................................................... 636
Monitoramento dos Contêineres .................................................................................. 637
Inventário .................................................................................................................... 637
Ferramentas de Orquestração ..................................................................................... 638
Kubernetes .................................................................................................................. 638
Docker Swarm ............................................................................................................. 638
Outros Livros do Autor .......................................................................................................... 639
Resumo dos Comandos ......................................................................................................... 644
Índice Remissívo ............................................................................................................. 657

xxviii
Certificação CompTIA Linux+

Como se preparar para o exame

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 1


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

2 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

A ciência da computação não é mais sobre computadores,


da mesma forma que a astronomia não é mais
sobre telescópios.
-- E. W. Dijkstra

Sempre existiu e vai existir uma lacuna no mercado de TI: os profissionais que saem das
faculdades nem sempre estão preparados para aquilo que o mercado quer e precisa. Ainda
mais no mercado de TI, onde a velocidade é muito grande e as tecnologias mudam e se
aprimoram a cada 6 meses.

Desta maneira, a indústria de TI, formada por grandes empresas, como IBM, HP, SuSe,
Microsoft, Cisco, Intel, RedHat, Apple, dentre outras, se reuniram através de associações ou
programas próprios de certificações para preencher essa lacuna no mercado de profissionais
capazes de trabalhar com eficácia nas suas plataformas, equipamentos e tecnologias.

A CompTIA tem um programa de certificação há 25 anos mais abrangente, que abraça


diversas tecnologias, não só o Linux.

Em 2012, essas duas organizações resolveram unir suas forças no mundo Linux para criar
uma certificação dupla, de forma que o profissional que se certificava no CompTIA Linux+
Powered by LPI, recebia o certificado da CompTIA, e também o certificado da LPI, LPIC-1. Isso
fui muito bom para o mercado de Linux até outubro de 2019. Nesta data este acordo foi
dissolvido, e a CompTIA criou seu próprio exame de Linux+, composto por uma só prova, o
exame XK0-004, assunto deste livro.

A Certificação, além de ser um grande incentivo, garante a entrada e sustentabilidade dos


técnicos no mercado de trabalho capazes de realizar tarefas no Linux. Desta forma, a prova
da CompTIA Linux+ foi desenvolvida para certificar a competência do sistema de
administração usando o sistema operacional Linux e suas ferramentas associadas. O exame
foi desenvolvido para ser neutro em termos de distribuição, seguindo o Linux Standard Base
entre outros padrões e convenções relevantes.

Se você está lendo esse livro, com certeza quer ter uma certificação de peso reconhecida
internacionalmente no seu currículo e no seu cartão de visitas. O mercado de software livre
está em crescimento e à procura de profissionais certificados. E isso é ótimo para você, sua
carreira e também seu bolso.

Este é um livro de Linux, objetivo, didático e focado nos temas da prova da CompTIA Linux+,
na última versão da prova. Você irá encontrar exatamente aquilo que precisa estudar e na
medida certa para o exame.

O exame tem 90 minutos de duração, com no máximo 90 questões.

A maioria das questões são de múltipla escolha onde existe somente uma opção correta.
Algumas irão apresentar um cenário onde alguma medida administrativa precisa ser tomada
e em outras se pergunta qual o comando apropriado para uma determinada tarefa.

Diferentemente de outros exames, a prova XK0-004 contém algumas questões em que o


candidato ira enfrentar um Shell e um problema em um determinado cenário. O candidato

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 3


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

deve executar os comandos que resolva o problema proposto.

A prova testará os conhecimentos do candidato em 5 tópicos, e o percentual do número de


questões por tópico é o seguinte:

1.0 Hardware e configuração do sistema: 21%


2.0 Operação e manutenção de sistemas: 26%
3.0 Segurança: 19%
4.0 Diagnóstico e resolução de problemas do Linux: 20%
5.0 Automação e script: 14%

Este exame irá testar seu conhecimento teórico e prático, comandos e suas opções comuns,
localização de arquivos importantes, sintaxe de configurações e procedimentos mais usados,
uma vez que você tenha conseguido solidificar os conceitos básicos do sistema operacional e
ferramentas associadas.

Os exames não tem a intenção de fazer perguntas de dupla interpretação e nem maldosas,
mas os tópicos abordados são mais complexos e exigem maior experiência do candidato.

Este livro também é dividido em 5 capítulos, separados e ordenados conforme o Guia Oficial
do exame XK0-004, e cobre todos os tópicos requeridos pelo exame.

No final de cada capítulo, há um link para um simulado que pode ser feito online, através do
computador ou celular, utilizando um navegador. Este simulado é para testar se você
aprendeu os conceitos contidos no capítulo, e não necessariamente representam questões
reais de prova.

Como Marcar a Prova?

O exame é aplicado no computador, com hora e local definidos pelo candidato, em um centro
Pearson Vue.

Onde encontrar um Centro PearsonVue?


Escolha pelo site deles: http://www. pearsonvue.com. Selecione “TEST TAKERS”. Depois
Digite COMPTIA no Box que irá aparecer. Então você poderá clicar no botão “Find a Test
Center” e digitar o nome da sua cidade.

Como é o ambiente da prova?


A prova feita pelo computador é simples. Este computador fica em uma pequena sala
fechada e isolada do som e distrações, como um biombo pequeno. Você não pode levar
nada. Deve deixar celular, agenda, papel, tudo guardado. Eles vão te dar papel, lápis e um
dicionário inglês-português se a prova for em inglês. Qualquer movimentação estranha eles
anulam seu teste. Você também será filmado por uma webcam durante o exame para
garantir que ele foi devidamente aplicado e nada anormal ocorreu. Os exames aplicados pela
PearsonVue foram reconhecidos mundialmente por sua segurança e por serem à prova de
fraudes.
4 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

Outro detalhe importante da prova em computador é que, se você errar alguma questão de
algum tópico, o computador seleciona mais questões do mesmo tópico para testar ainda
mais seus conhecimentos sobre o tema. Isto tem um lado bom e outro ruim. O lado bom é
que, se você tiver errado de “bobeira”, terá outra chance de redimir seu erro. Mas se você de
fato não estiver devidamente preparado para o tema, estará lascado.

A Importância de Fazer Exercícios

O cérebro é um “músculo”. Quanto mais exercitado, mais forte e resistente ele fica. Mais
conexões sinápticas ele será capaz de fazer e responder ao ambiente de forma apropriada.
Portanto, faça muitos exercícios sobre os tópicos. Exercite os comandos. Veja suas opções e
argumentos. Teste as funcionalidades de cada um deles.

Muitas pessoas me perguntam sobre qual distribuição de Linux é a mais adequada para a
certificação, testar os comandos, etc. Eu sempre respondo: aquela que você gostar mais. A
CompTIA preza pela independência das distribuições e neutralidade. A prova é focada em
LINUX, seja ele qual for.

De forma que toda configuração e manejo do servidor são feitos com comandos no Shell e
diretamente nos arquivos de configuração. Isto é muito bom porque o profissional fica
experiente em qualquer Linux e não fica viciado em alguma ferramenta amigável.

Mas existe alguma que eu indico? Sim. Mas se trata de minha opinião pessoal. Eu gosto do
Open-SuSE. É uma distribuição muito estável, feita por alemães que prezam muito pela
obediência completa aos padrões do Linux Standard Base. Os comandos, arquivos e
estrutura são exatamente como manda o figurino.

Só um detalhe importante: você precisará se familiarizar com os gerenciadores de pacote


Debian e RedHat. E geralmente uma distribuição adota um OU outro. E para preparar-se para
a prova é bom você estar afiado nos dois modelos. Portanto, escolha uma distribuição
baseada em Debian e outra em RedHat.

Aprendendo de Acordo com o Funcionamento do seu


Cérebro

Você também precisa se conhecer um pouco para que o aprendizado seja efetivo. Nossa
mente trabalha basicamente com 3 tipos de estilos de aprendizagem: físico, visual e
linguístico/sonoro. Como você fixa melhor aquilo que aprendeu?

Veja como são estes estilos e tente se identificar neles:

Físico
As pessoas com estas características são os inquietos, são os fuçadores, os desmontadores
de equipamentos e brinquedos, os que querem saber como funciona e ver por dentro, os que
não conseguem ficar sossegados em seu lugar.

Eles são pessoas que não conseguem ficar sentadas por muito tempo. Eles simplesmente

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 5


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

raciocinam melhor quando seus corpos estão em movimento, balançando o corpo entre uma
perna e outra, para frente e para trás. Eles interagem melhor com o mundo através do
contato manual e corporal. Os “Aprendizes” físicos adoram esportes, inventar, construir e
dançar.

Quando estão aprendendo ou adquirindo capacitação acadêmica, essas pessoas se


beneficiarão mais com atividades de expressão corporal, manipulando e tocando objetos,
realizando exercícios, etc.

Dicas para você aprender melhor:

• Realize seus estudos com montagens e construções de objetos e


simulações;
• Inclua aulas virtuais em computadores;
• Alterne seções teóricas e práticas durante o estudo.

Linguístico / Sonoro
São aquelas pessoas que vivem cantando ou entoando algum som mesmo com a boca
fechada, os cantores e aqueles descritos com tendo um ouvido musical. Veem sons em tudo.
Eles podem não ser os melhores cantores ou músicos, mas eles têm uma habilidade natural
para interagir e entender os sons, musicais ou não.

Sua relação com o mundo é através dos sons e ritmos sonoros. As atividades que podem ser
mais proveitosas para elas são ouvir músicas, tocar instrumentos, interpretar sons e cantar.

Quando estão aprendendo ou adquirindo capacitação acadêmica, essas pessoas se


beneficiarão mais escrevendo letras e canções para músicas, tocando instrumentos para
acompanhar seus trabalhos ou de outros, ou desenvolvendo projetos de multimídia.

Dicas para você aprender melhor:

• Tente transformar aquilo que você está aprendendo em música;


• Grave aquilo que está aprendendo para escutar depois;
• Utilize música agradável durante os estudos.

Visual
Estas pessoas são os modernos Picassos e Renoirs, os grafiteiros e rabiscadores, e indivíduos
que têm um talento natural para as cores e para harmonizar ambientes. Os indivíduos
Visuais parecem ter um senso artístico que faz com que tudo que criem pareça agradável aos
olhos. Sua relação com o mundo é através de pinturas e imagens. As atividades que podem
ser mais proveitosas para elas incluem pintura, escultura e a criação de artes gráficas.

6 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Quando estão aprendendo ou adquirindo capacitação acadêmica, essas pessoas se


beneficiarão mais com desenho e criação de diagramas, inclusive gráficos, leitura
cartográfica, criação de mapas ou realizando demonstrações.

Dicas para você aprender melhor:

• Crie apresentações multimídia;


• Utilize interpretação de mapas, diagramas e gráficos;
• Use e abuse de ilustrações, gráficos, slides, filmes etc.

Uma vez que você tenha se identificado em pelo menos um destes estilos, faça uso das
potencialidades do seu cérebro. Isso facilita seu aprendizado.

Mapas Mentais

Você talvez possa conhecer esse artifício de estudos chamado Mapa Mental, ou esquema de
espinha de peixe. Ele é muito útil, pois além de ser visual, ajuda a organizar as idéias de uma
forma muito prática para memorização. Na entrada dos capítulos será apresentado um
esquema de mapa mental dos temas daquele tópico.

Figura 1 - Esquema Espinha de Peixe

Como exercício, execute cada comando de cada tópico pelo menos mais de uma vez,
exercitando as possíveis situações. Faça as seguintes perguntas para cada comando
estudado:

Para que serve este comando?


Como ele é usado?
Quando ele é usado?
Quais arquivos ele afeta?

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 7


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Eu sugiro que você faça um esquema de espinha de peixe para os comandos, de forma que
você trabalhe com todas as potencialidades de aprendizado do seu cérebro: visual, físico, e
leia o texto em voz alta para também exercitar o lado sonoro.

Neste tipo de esquema atente a pelo menos dois tipos de estilo de aprendizagem: o físico
pois você está fazendo movimentos ao escrever; visual pois você está fazendo um diagrama.
Também ajuda na lógica e memorização pois você está categorizando a informação em
COMO, O QUE, QUANDO e ARQUIVOS. Se possível compre fichas pautadas 10x15cm que são
excelente para fazer consultas rápidas e podem te ajudar na memorização.

Tente imaginar as situações em que os comandos são usados e teste os diversos tipos de
opções que eles têm. Isto é importante porque uma opção de um comando pode inverter o
resultado.

Por exemplo, o comando “grep uira texto.txt” vai filtrar todas as ocorrências da palavra
“uira” no arquivo texto.txt. Já o grep com a opção “-v” inverte, de forma que o comando irá
mostrar todas as linhas que não têm a palavra “uira” no texto.txt.

Você pode recorrer aos manuais “MAN” dos comandos de cada tópico. Eles têm informações
importantes que o programador que desenvolveu o software deixou ali de forma especial
para você. Vários comandos também tem os vídeos demonstrando seu uso, que podem ser
acessados através do QR-CODE.

Flashcards

O flashcard é uma metodologia amplamente utilizada para memorização de conceitos e


fórmulas.

Basta recortar pequenos pedaços de papel (fichas, cartões, postit) e escrever uma pergunta
na frente e uma resposta no verso.

Este método simples é eficaz porque:

Você precisa pensar para formular as perguntas;


Você precisa ser conciso para escrever as respostas;
Ao escrever perguntas e respostas estabelece vínculos entre os assuntos;
Ao escrever, fortalece o estímulo físico;
Ao ler os cartões, pode usar voz alta, para fortalecer o estímulo sonoro/linguístico;
Ao visualizar os cartões também fortalece o estímulo visual;
Ao responder as perguntas e verificar as respostas, estimula os conexões neurais e
favorece a memorização.

Você Precisa Fazer Simulados!

Este item é um complemento do anterior, mas é tão importante que resolvi separá-lo para
que você dê mais atenção a ele.

8 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Um simulado vai te dar uma ideia exata do tipo de questões das provas com que você vai se
deparar pelo caminho. Há questões que são maldosamente formuladas para que você caia
na vala do senso comum.

Veja que existem questões que vão priorizar pela simples memorização, outras vão exercitar
sua capacidade de análise em entender um problema do “mundo real” e sua capacidade de
transpor para o “mundo computacional”; outras vão exercitar seu julgamento diante de um
problema em questão e outras vão te apresentar um problema e a solução e você deverá
avaliar se a solução é a correta ou não e por que.

A prova é feita para não ser fácil. E isto é de suma importância para atestar a qualidade das
pessoas que são certificadas. Se qualquer um com pouco preparo pode ser certificado, de
que adianta exibir este título no currículo? Mas se é para os poucos que realmente se
dedicaram e estudaram a fundo, ora, é uma certificação de peso.

Ao término de cada capítulo, você poderá fazer o simulado dos tópicos abordados, clicando
no link ou no QR-CODE.

Aulas dos Comandos

Este livro contém diversos Qr-Codes que apontam para pequenas video-aulas sobre os
comandos citados. São mais de 8 horas de aula no total. Assim, esperamos que ao ler sobre
os comandos, você também possa ver um vídeo de uso do comando. Desta forma, você não
fica com dúvidas e ainda exercita os 3 modelos de aprendizado: visual, linguistico e físico.

Para usar o QR-CODE, basta usar o App de câmera ou App de leitura de QR-CODE no seu
celular, apontar para o QR-CODE e curtir a aula.

Figura 2 - Usando o QR-CODE

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 9


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Um Linux para você na Web

Também disponibilizamos para você um Terminal Linux Fedora via navegador para você
treinar todos os comandos do livro, de forma fácil e descomplicada.

Para usar esta máquina virtual você precisa abrir o link usando um navegador de Internet
atualizado como Firefox, Chrome ou Safari. O Linux Fedora vai rodar no seu navegador, em
uma máquina virtual executada localmente no seu computador, em segundos.

http://bit.ly/labvirtuallinux

10 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Grupo de Estudos no Telegram

Se você quiser ajuda da comunidade para troca de experiências, dicas e algum suporte,
entre no nosso grupo do Telegram, especialmente criado para os leitores do Livro.

Utilize o link abaixo, ou leia o QR-CODE com seu celular:

https://t.me/comptialinux

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 11


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Desconto Acadêmico pra quem é da America Latina


e Caribe

A CompTIA, através de seu Diretor da América Latina e Caribe, disponibilizou para os leitores
deste livro o desconto acadêmico para quem comprar o Voucher para o exame CompTIA
Linux+ XK0-004, via site da Pearson Vue.

Este desconto somente é válido para pessoas físicas residentes da América Latina e Caribe:
Argentina, Bolívia, Brasil, Caribe, Chile, Colômbia, Costa Rica, Cuba, Equador, El
Salvador, Guatemala, Haiti, Honduras, México, Nicarágua, Panamá, Paraguai, Peru,
República Dominicana, Uruguai e Venezuela.

Se você é residente em um destes países, pode comprar o voucher da prova CompTIA Linux+
XK0-004 com desconto acadêmico.

No fechamento desta edição, em Janeiro de 2020, o voucher normal para a prova pode ser
adquirido no site da CompTIA Store por US$ 329.

No desconto acadêmico, o mesmo voucher pode ser comprado por US$ 159.

Isto significa um desconto de US$ 170.

Somente um cupom de desconto por exemplar.

Para solicitar seu desconto acadêmico, por favor preencha o formulário no site:

https://www.certificacaolinux.com.br/descontoacademico

Amarás o Senhor teu Deus de todo o teu coração, e ao próximo,


como a ti mesmo.
-- Jesus - Mateus, 22: 36 a 40

12 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Hardware e Configuração do
Sistema

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 13


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

14 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

O amor é grande e
cabe no breve espaço de beijar
-- Carlos Drummond de Andrade

Simulado
1.1 Conceitos do Processo de Boot do
Linux

Qualquer computador PC quando ligado inicia uma série de ações complexas de teste de
hardware programada por uma memória especial chamada de BIOS. Esta memória tem a
função de dar a partida na máquina, reconhecendo os dispositivos instalados e realizando a
carga do sistema operacional.

Durante o boot, o BIOS realiza uma série de testes, cuja função é determinar com exatidão os
componentes de hardware instalados no sistema. Este teste é chamado de POST (power-on
self test). É através do POST que o computador busca informações dos números e dos tipos
de placas, drives de cd-rom, HDs, portas seriais, paralelas e USBs, monitor, mouse, teclado
etc.

Uma limitação das BIOS originais era a capacidade limitada de ler somente um setor de
dados do disco para a memória. Como um setor é insuficiente para armazenar todo um
sistema, os sistemas operacionais, incluindo o Linux, dividiram o processo de carga em duas
partes.

Primeiro, logo depois dos testes de hardware, a BIOS procura nos dispositivos de
armazenamento conectados um endereço especial chamado de setor de boot. Grande parte
das BIOS são capazes de procurar pelo setor de boot em diversos locais, tais como: discos
rígidos, discos externos, CD-ROMs, DVDs, Pendrivers, em arquivos ISO (imagens de disco) e
até de servidores remotos em rede usando NFS (Network File System), HTTP e FTP.

Esse setor de boot contém um pequeno programa que é parte do gerenciador de boot, que
pode ler qualquer outro setor do disco, e carrega o restante do gerenciador de boot.

O gerenciador de boot por sua vez, carrega na memória o restante do software para
reconhecer o hardware, e tem na sua configuração um apontamento de onde está no disco o
sistema operacional para que possa ser carregado.

Geralmente os gerenciadores de boot podem apresentar ao usuário um menu com opções de


qual sistema operacional o utilizador deseja carregar, ou até mesmo carregar o sistema
operacional em modo de recuperação.

Existe até mesmo a possibilidade de um gerenciador de boot apontar para outro gerenciador
de boot, que por sua vez aponta para um sistema operacional. Isso pode acontecer em
instalações de Dual Boot, onde dois sistemas operacionais distintos convivem na mesma
máquina. Por exemplo, ter o Linux e o Windows instalados no mesmo hardware. Desta forma,

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 15


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

pode-se ter o gerenciador de boot padrão do Linux instalado, que pode carregar o Linux ou
carregar o gerenciador de boot do Windows.

Era assim que os computadores pessoais iniciavam até 1998.

Devido a uma série de limitações da BIOS, especialmente no tocante a limitação de lidar com
discos grandes e muita memória RAM, os fabricantes de placa mãe resolveram parar de
"remendar" as BIOS e criar um novo sistema chamado EFI (Extensible Firmware Inteface). Em
2005 outros fabricantes adotaram o modelo EFI criado pela Intel e uma especificação
universal de EFI foi amplamente adotada: Universal EFI (UEFI).

Nas placas mães que adotam o sistema EFI ou UEFI, o processo de carga do sistema
operacional envolve ler um arquivo especial de carga à partir de um sistema de arquivo em
uma partição especial chamada EFI System Partition (ESP). Esta partição especial usa o
formato da FAT (File Allocation Table). No Linux é tipicamente montada em /boot/efi.

Este esquema utilizado pelo EFI é mais complexo que na BIOS, permitindo que cada sistema
operacional instalado no computador tenha o seu próprio sistema de carga de boot separado.
Desta forma o EFI possui um “gerenciador de boot” que permite que o usuário escolha qual
sistema de carga de boot quer dar início quando liga o computador.

Para que este sistema “gerenciador de boot” do EFI funcione, é preciso que os sistemas de
carga de boot estejam devidamente registrados no firmware através do próprio utilitário da
EFI ou através do programa efibootmgr no Linux.

Os gerenciadores de boot que são armazenados na partição especial do EFI geralmente


possuem a extensão de arquivo ".efi"

Processo de Carga do Kernel

Dependendo do tipo de disco utilizado, o setor de boot, ou setor de carga, está localizado em
um local específico com uma determinada assinatura definida por padrões da indústria.

É no setor de boot que os sistemas operacionais gravam o software responsável por iniciar a
carga do sistema operacional.

Desta forma, a BIOS ou firmware de placa-mãe procura no setor de boot do disco o


Gerenciador de Boot.

No Linux gerenciadores mais comuns são GRUB e GRUB 2. Eles são responsáveis pela carga
do Kernel na memória. O antigo LILO não é mais abordado na prova, uma vez que a grande
maioria das distribuições já o abandonou. Em compensação, o GRUB 2 passa a fazer parte
dos requisitos da prova.

A primeira versão do GRUB foi criada em 1999, e foi adotada amplamente por quase todas as
distribuições ativas. Hoje essa versão é chamada de GRUB Legado, uma vez que em 2005 o
GRUB foi inteiramente reescrito, com várias novas funcionalidades, que é conhecia por GRUB
2. Dificilmente há uma distribuição que ainda utilize o Grub legado.

16 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Desde o Kernel 3 do Linux, e com advento do UEFI, é possível dar partida em um Linux sem a
necessidade de um gerenciador de boot, com carga do Kernel diretamente pela UEFI. Mas
isso dificilmente é adotado, uma vez que o GRUB2 oferece algumas opções interessantes.

Durante a carga do kernel, o Linux carrega um sistema de arquivos especial chamado


initramfs, que contém uma versão minimalista do sistema de arquivos, para que o processo
init (pai de todos os processos) possa ser carregado. Isto permite que diversas tarefas
possam ser executadas antes que o sistema de arquivos real seja carregado.

Após a carga do Kernel, nos sistemas baseados no System V Init, este inicia um processo
especial chamado init. Este processo é o pai de todos os processos e responsável pelo
restante da carga do boot do Linux.

O init é responsável por executar todos os scripts de carga de serviços que o Linux executa
durante o processo de carga do sistema operacional, tais como agendador de tarefas (Cron),
Ambiente Gráfico, Servidor HTTPD, etc.

Atualmente as distribuições substituíram o System V Init por um sistema robusto, chamado


Systemd. Neste caso, o processo pai de todos os processos se chama systemd.

A ideia permanece a mesma. O systemd é o pai de todos os processos que utilizam esse
sistema, e ele é responsável por rodar todos os scripts de carga de serviços do sistema.

O systemd possui diversas melhorias em relação ao init, podendo-se destacar o paralelismo


de carga de serviços, que aproveita as CPU's com múltiplos núcleos, fazendo com que o
Linux carregue mais rápido.

Depois da carga do boot, o systemd ou init chama outro programa especial chamado getty,
que é responsável pela autenticação dos usuários e pelo início do processo de shell.

Gerenciador de Boot

A maioria das distribuições Linux trabalha com o Gerenciador de Boot GRUB (Grand Unified
Bootloader) na versão 1 ou versão 2. Atualmente quase todas as distribuições já usa o GRUB
na segunda versão.

O Gerenciador de Boot é responsável pela carga do Kernel do Linux e também para a carga
de outros sistemas operacionais que possam existir no computador. Ele é capaz de dar carga
não só do Linux, bem como Windows e outros sistemas.

Como dissemos, quando um computador é ligado, ele carrega um conjunto de instruções


gravado numa memória especial chamada firmware na placa mãe do computador.

Existem muitos tipos de firmware que inicializam o hardware do sistema durante o processo
de inicialização, dependendo do fabricante. As opções mais comuns são o Open-Efi e Legacy /
UEFI BIOS (Unified Extensible Firmware Interface).

O firmware de maneira geral serve para reconhecer e configurar o hardware e testá-lo antes
de entregar o funcionamento para um sistema operacional.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 17


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Desta forma, depois de lidar com o hardware, o firmware procura pelo Gerenciador de Boot,
para que este possa fazer a carga do sistema operacional.

O Gerenciador de Boot então é responsável por carregar o Kernel do Sistema Operacional.

O GRUB 2 possui uma capacidade especial de inicializar a partir de qualquer formato de


sistema de arquivos, como HFS + (macOS), NTFS (geralmente Windows), ext3 / 4
(geralmente Linux), XFS e muito mais.

Ele também suporta esquemas de particionamento de discos como o MBR (Master Boot
Record) e GPT (GUID Partition Tables).

Outra característica especial do GRUB é permite que alguns parâmetros sejam passados para
o Kernel durante a sua carga. Estes parâmetros podem passar para o Kernel algumas
informações que ele pode não ser capaz de buscar por conta própria, como um parâmetro
para funcionamento de algum hardware, ou até mesmo mudar o comportamento o Kernel.

Estes parâmetros de carga do Kernel podem estar escritos no arquivo de configuração dos
Gerenciadores de Boot ou informados pelo usuário através da linha de comando antes da
carga do sistema operacional.

Dependendo do seu hardware e configurações dos módulos do Kernel, estes parâmetros


podem especificar configurações de recursos como portas de entrada e saída (IO Ports), IRQ
etc, resolução de vídeo, etc.

O Kernel do Linux geralmente é um único arquivo executável compactado que reside no


diretório /boot. Depois que o Kernel é carregado, ele pode procurar por Módulos do Kernel, de
forma a completar o funcionamento e habilitar recursos no sistema operacional. Fazendo um
paralelo com o mundo Windows, os módulos do Kernel também podem ser chamados
grosseiramente de "drivers".

É importante ressaltar que o Gerenciador de Boot não lida diretamente com os Módulos do
Kernel. Isto é feito pelo Kernel através de um arquivo especial chamado initramfs.

O initramfs basicamente é um Sistema de Arquivos mínimo, que contém um conjunto de


diretórios que você encontraria em um sistema de arquivos raiz normal. Ele é empacotado
num único arquivo compactado que também reside no diretório /boot.

O initramfs existe na maioria das distribuições para abrigar os Módulos do Kernel que são
carregados de forma padrão no processo de carga do Linux. Isto é necessário porque na
maioria dos computadores, existem muitas incógnitas, como tipos de sistema de arquivos e
layouts de disco. Desta forma o initramfs é um sistema de arquivos simples que o Kernel
possa acessar para ler seus módulos, habilitar sistemas de arquivos complexos como XFS,
LVM, etc, e então montar o sistema de arquivos definitivo.

Desta forma, no momento da inicialização, o Gerenciador de Boot carrega o kernel e a


imagem initramfs na memória e inicia o kernel.

O Kernel então verifica a presença do initramfs e, se encontrado, monta-o como raiz "/" para
carregar os módulos e o programa init.

Enquanto o Kernel é carregado na inicialização do sistema, ele exibe uma série de


18 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

mensagens úteis que irão informar a identificação do Kernel, informações de CPU e memória,
dispositivos de hardware, discos, partições, serviços de rede etc.

Essas informações de carga do Kernel são gravadas numa pequena área de memória
especial que pode ser acessada pelo utilitário dmesg.

Depois de carregado o Kernel, o Linux executa um Gerenciador de Serviços. O Gerenciador


de Serviços pode ser o antigo System V herdado do Unix, ou o moderno Systemd.

Uma vez carregado o Gerenciador de Serviços, ele é responsável por chamar diversos
processos em uma ordem programada chamada de “nível de execução”, ou Runlevels.
Este nível de execução vai determinar quais os serviços serão executados durante a carga do
sistema.

Figura 3 - Processo de Carga com System V Init

No System V Init, os Runlevels são diretórios numerados no /etc/init.d/rcX.d, onde X


representa o nível de execução.

Por exemplo:

Para o nível de execução de modo texto Runlevel 3, os scripts de carga residem no

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 19


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

diretório /etc/init.d/rc3.d
Para o nível de execução de modo gráfico Runlevel 5, os scripts de carga residem no
diretório /etc/init.d/rc5.d

Por exemplo, podemos definir que um determinado nível vai chamar todos os serviços que
um servidor precisa rodar, como SSH, servidor HTTP, servidor de ftp e servidor de e-mail. Mas
para uma situação de emergência, onde o administrador precisa efetuar alguma
manutenção, podemos determinar um nível de execução onde somente o básico seja
executado.

Já no systemd, os níveis de execução são definidos por alvos ou Targets. Os Targets são
compostos de vários componentes que são chamados de Units. As units podem ser do tipo
de serviço (service), pontos de montagem (mount), etc.

Figura 4 - Processo de Carga com Systemd


20 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

No Systemd, por exemplo:

Para o nível de execução de modo texto o Target é o Multi-User.


Para o nível de execução de modo gráfico o Target é o Graphical

Os problemas que podem ocorrer durante a carga do sistema como reconhecimento de


dispositivos, erro na leitura de módulos do Kernel, erro na execução de serviços podem ser
analisados no principal arquivo de LOG do sistema /var/log/messages.

Instalando um Gerenciador de Boot

Os gerenciadores de boot ou partida são programas que carregam o Kernel do Linux e até
permitem a escolha de um outro sistema operacional.

O principal gerenciador de boot do Linux é o GRUB que existe em duas versões.

No exame, o candidato deve ser capaz de fornecendo locais de inicialização alternativos e


opções de inicialização de backup, instalar o Grub Legado (versão 1) ou o GRUB novo (versão
2), executar algumas alterações básicas de configuração para o GRUB 2, e por último saber
como interagir com o gerenciador no momento do boot.

Grand Unified Boot Loader (GRUB


Legado - 1)

A maioria das distribuições já adotou o GRUB 1 como gerenciador padrão. Ele é flexível,
funcional e poderoso, podendo carregar sistemas operacionais como o Windows (9x, ME, NT,
2000 e XP), DOS, Linux, GNU Hurd, *BSD, OS/2 e outros.

O GRUB 1 também permite buscar imagens do Kernel pela rede, por cabo serial, suporta
discos rígidos IDE, SATA, PATA e SCSI e tem interface voltada para a linha de comandos ou
menus. Suporta sistemas sem discos e terminais remotos.

A notação dos dispositivos de disco utilizada pelo GRUB 1 difere um pouco do usual, de forma
que o nome dos discos sempre serão “hd”, seguidos da numeração do disco iniciando por
zero, seguidos do número da partição, iniciando também do zero.

Veja a tabela comparativa:

TABELA – Notação de discos no Grub 1

Notação no Linux Notação no Grub 1

/dev/sda (hd0)

/dev/sda1 (hd0,0)

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 21


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Notação no Linux Notação no Grub 1

/dev/sda2 (hd0,1)

/dev/sdb (hd1)

/dev/sdb1 (hd1,0)

/dev/sdb2 (hd1,1)

Não há distinção entre os discos IDE e SCSI. Ambos são referenciados como (hdx) pelo GRUB
1.

Nativamente o GRUB 1 não suporta EFI em versões anteriores ao kernel 3.30.

O GRUB 1 possui um arquivo de configuração chamado /boot/grub/menu.lst. Algumas


distribuições como Fedora, RedHat e Gentoo preferem utilizar grub.conf ao invés de
menu.lst.

Este arquivo é dividido em parâmetros Globais, que afetam o GRUB 1 e parâmetros que só
têm efeito para as imagens do sistema que será carregado.

Vejamos os parâmetros globais:

timeout: Define um tempo (em segundos) de espera para o prompt ou menu. Se


nenhuma intervenção do usuário for feita no boot, o GRUB 1 carrega a imagem
padrão;
default: Define qual será a imagem padrão que será carregada se nenhuma outra for
selecionada;
fallback: Caso ocorra algum erro inesperado e a opção padrão não possa ser
carregada, este parâmetro define qual outra imagem deve ser utilizada;
color: Permite que você escolha as cores usadas no menu de boot;
password: Permite que você especifique uma senha para qualquer ação que não
seja carregar as imagens disponíveis. Por exemplo, acessar a linha de comandos do
GRUB 1;
hiddenmenu: Esta opção faz com que o menu de opções não seja mostrado e que a
carga da imagem especificada pela linha “default” seja carregada. O usuário pode
requisitar o menu com as opções pressionando a tecla <ESC> antes que o tempo
definido em timeout expire.

Parâmetros que afetam apenas as imagens:

title: Define um texto que será apresentado no menu de boot para identificar o
sistema;
root: Determina qual é a partição raiz de uma determinada imagem;
rootnoverify: Idêntica à opção root, mas não tenta montar a partição raiz. Utilizada
para alguns sistemas como o Microsoft Windows;
22 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

kernel: Esta opção informa qual imagem de Kernel vai ser carregada. Alguns
parâmetros do Kernel podem ser passados;
module: Faz com que algum módulo necessário para o boot seja carregado. Lembre-
se que estes não são módulos do Kernel (módulos de som, rede, etc.) e sim módulos
necessários ao boot de alguns sistemas, como o GNU Hurd;
lock: Bloqueia a carga da imagem do Kernel por senha. A senha precisa ser
especificada com a opção password;
makeactive: Torna a partição ativa para boot. Este comando está limitado a
partições primárias dos discos;
chainloader: Especifica a localização do gerenciador de boot de outros sistemas
operacionais. Alguns sistemas, como o Microsoft Windows, armazenam seu próprio
gerenciador de boot no início da partição onde estão instalados.

Veja um exemplo de menu.lst:

# GRUB - GRand Unified Bootloader


# Definindo o tempo de espera (em segundos) para a entrada do
teclado.
timeout = 10

# Definindo qual sistema operacional será padrão para ser


automaticamente
default = 0

# Define uma senha global para o GRUB.


password = --md5 $1$5hUaL1$AF2aPsqtVHZw2N4n1QtCI1

# Boot com o Windows


title = Windows
unhide (hd0,0)
rootnoverify (hd0,0)
chainloader +1
makeactive

# Boot com o Slackware Linux


title = Slackware Linux
kernel = (hd0,1)/boot/bzImage-2.6.12.3 vga=771
root = (hd0,1)

Para alterar, incluir ou excluir a carga de algum sistema operacional no Grub 1, basta alterar
o arquivo menu.lst.

initramfs

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 23


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Como já apresentado anteriormente, o initramfs ou initrd é um arquivo especial que contém


os drivers necessários para reconhecimento do hardware antes da carga do Kernel.

Inicialmente o Linux utilizava o initrd como imagem em RAM para fazer o trabalho de
armazenar os drivers necessários para a carga do Kernel. A partir do Kernel 2.6, esse sistema
evoluiu para uma versão melhorada e menos complexa, conhecida como initramfs.

De qualquer forma, a idéia deste pequeno sistema de arquivos é a mesma: ele é montado
como um sistema de arquivos temporário, de forma que um driver necessário para a carga
do sistema esteja disponível e possa ser lido.

mkinitrd
Nas distribuições baseadas em Redhat, comando mkinitrd é utilizado para criar uma nova
imagem do "Init RAM disk" (initrd) contendo os módulos para o hardware. Nas distribuições
baseadas em Debian, esse programa tem o nome de mkinitramfs.

dracut
Alternativamente, o utilitário dracut também pode ser utilizado para criar uma imagem de
initramfs com os módulos necessários para a carga do Kernel.

vmlinuz

A imagem do Kernel reside geralmente no diretório ou partição /boot.

Convencionou-se que o nome do arquivo da imagem do Kernel chame vmlinuz. O "z" no final
indica que a imagem do Kernel está comprimida, geralmente por um algoritmo como o
bzImage. Se a imagem não estiver comprimida, ela tem o nome de vmlinux.

Na listagem abaixo podemos visualizar o diretório efi que é montado no /boot, o diretório


grub2 com a configuração do grub2, o arquivo com a imagem comprimida do kernel
(vmlinuz) e a imagem no initramfs:

$ ls -lh /boot/
drwxr-xr-x 3 root root 17 ago 29 22:47 efi
drwx------ 5 root root 79 nov 3 01:37 grub2
-rw------- 1 root root 30M out 15 01:56
initramfs-4.14.146-119.123.amzn2.x86_64.img
-rwxr-xr-x 1 root root 5,5M set 23 17:18
/boot/vmlinuz-4.14.146-119.123.amzn2.x86_64

grub-install
# grub-install [opções] partição
24 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

Este comando instala o GRUB 1 como gerenciador de boot no MBR do primeiro disco e cria o
diretório /boot/grub. Este diretório contém os arquivos necessários para o seu
funcionamento.

As opções mais frequentes são:

--boot-directory=diretório: Esta opção instala o GRUB 1 em diretório que não seja


o raiz. É útil para instalá-lo em outras partições;
--recheck: Esta opção checa novamente o mapa de dispositivos em
/boot/grub/device.map. É útil quando um novo disco for acrescentado ou retirado do
sistema.

Para instalar o Grub 1, basta rodar o grub-install:

# grub-install /dev/sda

Se quiser instalar o Grub em outro diretório que não seja o raiz:

# grub-install --boot-directory=/bootalternativo

Grand Unified Boot Loader (GRUB – 2)

O Grub 2 é o gerenciador de boot padrão da maioria das distribuições, desde o Kernel 2.6.

O Grub 2 foi totalmente reescrito completamente com o objetivo de permitir grande


flexibilidade e ganho de performance. Dentre as diversas melhorias, as principais são:

Suporte a script com expressões condicionais e funções;


Carga de módulos de forma dinâmica;
Modo de Emergência (Rescue Mode);
Menus Personalizados;
Suporte a temas;
Suporte a menu gráfico com tela “splash”;
Carga de imagens ISO de Live CDs;
Nova estrutura do arquivo de configuração;
Suporte a plataforma não x86 (ex: PowerPC);
Suporte universal a UUIDs (Universally Unique IDentifier) – identificador usado em
sistemas distribuídos.

O upgrade do Grub 1 para o Grub 2 é relativamente fácil. Primeiro deve-se instalar o pacote

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 25


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

do Grub 2 com o comando:

# sudo apt-get install grub-pc

Depois de instalado, o Grub 2 irá apresentar um menu de teste, com as imagens de kernel
encontradas e ainda possibilita que o menu seja editado.

Uma vez definido o menu, o Grub2 pode ser instalado de forma definitiva com o comando:

# sudo upgrade-from-grub-legacy /boot/grub/grub.cfg

Principais Mudanças do Grub 1 para o Grub 2


É importante que você saiba quais são as mudanças importantes do Grub 1 para o Grub 2, a
saber:

O arquivo /boot/grub/menu.lst foi substituído pelo /boot/grub/grub.cfg;


O principal arquivo de configuração é o /etc/default/grub;
O sistema de numeração das partições foi alterado;
Buscas por outros sistemas operacionais são feitas de forma automática toda vez que
o update-grub é executado e são colocadas no menu;
Mudanças na configuração não têm efeito até que o comando update-grub é
executado.

Normalmente o arquivo /boot/grub/grub.cfg não deve ser editado manualmente pois ele é
regravado em updates do pacote do Grub 2, quando um kernel é adicionado ou removido, ou
o usuário aciona o comando update-grub. Este comando refaz o menu de carga a partir de
outros arquivos de configuração e regrava o /boot/grub/grub.cfg.

O utilitário grub-mkconfig também pode ser utilizado para criar uma configuração para o
Grub:

# grub-mkconfig -o /boot/grub/grub.cfg

O principal arquivo de configuração da apresentação do menu fica localizado em


/etc/default/grub.

/etc/default/grub
Este arquivo contém as principais informações para que o Grub 2 possa montar o menu. Ele
define qual será a opção padrão do menu, os tempos de espera por uma ação do usuário, se
o menu será apresentado em modo gráfico ou modo texto, dentre outras opções.

Exemplo de /etc/default/grub:

26 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

GRUB_DEFAULT=0
#GRUB_SAVEDEFAULT = true
#GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=‘lsb_release -i -s 2> /dev/null || echo Debian‘
GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash”
GRUB_CMDLINE_LINUX=””
#GRUB_TERMINAL=console
#GRUB_GFXMODE=640x480
#GRUB_DISABLE_LINUX_RECOVERY=”true”
#GRUB_INIT_TUNE=”480 440 1”

A seguir uma pequena explicação de cada variável do /etc/default/grub:

GRUB_DEFAULT

Define qual será a opção padrão do menu do Grub. O parametro GRUB_DEFAULT pode
assumir um valor numérico, o nome da opção no menu ou a palavra “saved”.

Se o valor for numérico indica a posição do menu em /boot/grub/grub.cfg. Pode indicar


também o nome do menu “Ubuntu 2.6.31”.

Se o valor for “saved”, o padrão será definido pelo comando grub-set-default ou grub-
reboot.

GRUB_SAVEDEFAULT

Se este parâmetro for “true”, ele diz para o Grub que a opção padrão do menu será
sempre o último sistema operacional selecionado no menu.

GRUB_HIDDEN_TIMEOUT

Este parâmetro define o tempo em segundos que o Grub irá esperar por uma ação do
usuário até que a opção padrão do menu seja escolhida de forma automática. Nenhum
menu será apresentado, a menos que o usuário aperte alguma tecla (geralmente o ESC).

Se for igual a zero, o sistema operacional padrão irá carregar de forma automática sem
esperar por nenhuma intervenção.

GRUB_HIDDEN_TIMEOUT_QUIET

Quando esta opção for “true”, nenhum contador de tempo será apresentado. Se for
“false”, um contador decrescente será apresentado com o tempo definido em
GRUB_HIDDEN_TIMEOUT.

GRUB_TIMEOUT

Esta opção somente será efetiva se a diretiva GRUB_HIDDEN_TIMEOUT estiver


comentada, ou se ativa, quando o usuário pressionar alguma tecla durante o tempo de

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 27


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

espera do GRUB_HIDDEN_TIMEOUT.

O GRUB_TIMEOUT define o tempo de espera do menu até que o usuário faça sua
escolha. Caso contrário, irá executar a opção padrão.

Se o valor for -1, o Grub irá esperar pelo usuário indefinidamente.

GRUB_DISTRIBUTOR

Determina a descrição do sistema que será usada no menu. Se nada for definido, o Grub
utilizará o padrão do sistema, que geralmente é definido pelo comando:

# lsb_release -i -s 2> /dev/null || echo Debian


SUSE LINUX

GRUB_CMDLINE_LINUX_DEFAULT

Essa diretiva passa parâmetros para o Kernel durante a carga normal do sistema.

GRUB_CMDLINE_LINUX

Essa diretiva passa parâmetros para o Kernel durante a carga do sistema, tanto para
carga normal do kernel ou em modo “recovery”.

GRUB_TERMINAL

Esta opção, se for descomentada, desabilita o menu em modo gráfico.

GRUB_GFXMODE

Define a resolução do terminal gráfico do menu.

GRUB_DISABLE_LINUX_RECOVERY

Desabilita o modo de emergência do Kernel se for igual a “true”.

GRUB_INIT_TUNE

Define um “som” que o grub fará antes de apresentar o menu. O formato é[tom da nota]
[duração].

Exemplo: Tema de Contatos imediatos de Terceiro Grau:GRUB_INIT_TUNE=”480 900 2


1000 2 800 2 400 2 600 3”

O Grub 2 ainda mantém um diretório em /etc/grub.d que contém scripts que são lidos
para montar o menu do Grub.

/etc/grub.d
Os scripts deste diretório são lidos durante a chamada do comando update-grub e suas
instruções são incorporadas no arquivo /boot/grub/grub.cfg.

28 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

A ordem dos itens no menu do grub é determinada pela ordem dos scripts neste diretório. Os
arquivos são lidos de acordo com o numeral que precede seu nome, em ordem crescente.

Alguns arquivos neste diretório se destacam:

00_header

Configura os parâmetros iniciais, como o modo gráfico, opção do menu padrão. Estas
configurações geralmente são importadas do /etc/default/grub.

05_debian_theme

Configura a tela de fundo, cores do texto, etc.

10_hurd

Usado para localizar Kernels Hurd. Não é utilizado na maioria das distribuições.

10_linux

Identifica os Kernels no dispositivo raiz e cria os itens do menu. Todas as imagens de


kernel existentes no /boot serão colocadas no menu.

20_memtest86+

Procura pela imagem em /boot/memtest86+.bin usado para teste de memória. Para


remover esse item, é necessário remover a imagem no diretório /boot.

30_os-prober

Este script procura pelo Linux e outros sistemas operacionais existentes no disco e cria
os itens do menu. As variáveis neste arquivo determinam como os nomes irão aparecer
no menu.

40_custom

Permite adicionar entradas customizadas no menu do grub.

Instalar novos Sistemas ou Imagens de Kernel


As configurações no Grub 2 são geralmente feitas no arquivo /etc/default/grub, alterando
as variáveis para o que se deseja.

Não é comum editar diretamente os scripts do diretório /etc/grub.d. Isto é reservado para
usuários avançados e foge do escopo da prova.

Para instalar uma nova versão do Kernel no Grub 2, basta adicionar o arquivo binário
comprimido do novo Kernel, bem como seu initramfs (se houver) no diretório /boot. O Grub 2
se encarrega de detectar e refazer o menu.

Qualquer alteração feita no /boot/grub/grub.cfg é regravada quando o comando update-


grub é executado.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 29


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Interação com o Grub


Como qualquer gerenciador de boot, o grub2 é executado antes de qualquer sistema
operacional. Ele geralmente fará a carga direta do sistema operacional definindo como
padrão ou se houver apenas um sistema operacional presente.

Se houver mais de um sistema operacional ou versão de Kernel, ele irá apresentar o menu
para escolha, por um tempo definido na variável GRUB_TIMEOUT no arquivo
/etc/default/grub.

O tempo padrão de espera do menu é de 10s. Se o usuário não fizer nada, ele irá iniciar a
carga da opção padrão do menu. A contagem do tempo pode ser paralisada se qualquer
tecla for pressionada.

O usuário pode forçar a apresentação do menu pressionando a tecla SHIFT durante a carga
do Grub 2.

Neste momento, o usuário também pode alterar a linha de comando com as variáveis que
serão passadas para o Kernel durante a sua carga.

Nomes das Partições no Grub 2


O sistema de nomear as partições no Grub 2 foi simplificado em relação ao Grub 1. A
contagem dos dispositivos permanece iniciando de zero.

Um dispositivo sda será nomeado de hd0, bem como um dispositivo sdb será chamado hd1.

No entanto as partições seguem a numeração “normal”, de forma que a partição sda5 será
nomeada como hd0,5 e sda3 será hd0,3.

Outros gerenciadores de boot

Outros gerenciadores de boot com atribuições bem específicas também podem ser utilizados
para dar carga no Linux:

SYSLINUX

O syslinux é o gerenciador de boot para sistemas que usam o sistema de arquivos FAT da
Microsoft, muito utilizado para dar partida em um Linux em cartões de memória USB e
pendrivers.

EXTLINUX

O extlinux é um mini bootloader para arrancar a partir de um sistema de arquivos ext2, ext3,
ext4 ou btrfs.

ISOLINUX

Um carregador de inicialização para arrancar a partir de uma rede LiveCD ou LiveDVD. Esse
gerenciador é utilizado com um Linux que roda a partir do DVD ou CD-ROM.
30 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

PXELINUX

Gerenciador de boot para dar carga através de um servidor de rede. Ele utiliza protocolos de
rede como BOOTP e DHCP, e necessita de um servidor com TFTP para descarregar a imagem
de boot do servidor para as estações. Geralmente é usado em máquinas Diskless, como em
caixas de supermercado ou outras aplicações específicas que não necessitam de um disco
local.

Kernel Panic!

Infelizmente ninguém está imune ao Kernel Panic, nem mesmo os grandes CEOs de gigantes
de software em apresentações ao público.

Quando o sistema não é capaz de iniciar, há provavelmente duas causas: falha no kernel ou
falha no driver de algum hardware.

Falha no Kernel
Uma falha de Kernel acontece quando o ele deixa de ser executado por algum motivo, e faz
com que todo o sistema "congele". Esta situação é conhecida como "Kernel Panic". A menos
que algum hardware falhe terrivelmente, é muito difícil ocorrer um Kernel Panic num Linux
em funcionamento.

Assim, a situação de Kernel Panic é comum durante a carga do sistema operacional, muito
provavelmente depois que alguma instalação de nova imagem de Kernel é feita, ou uma
biblioteca importante é atualizada, ou algum driver, ou módulo de Kernel é alterado.

Felizmente, essa situação pode ser facilmente contornável, se o Kernel antigo ainda estiver
instalado no sistema. De forma que um simples reboot para voltar ao kernel antigo é
suficiente para voltar ao funcionamento. Assim, é possível iniciar o sistema e fazer as
correções necessárias. Por isso, ao realizar uma instalação do novo Kernel é sempre uma boa
ideia manter o Kernel antigo.

Single-User
Outra possibilidade para resolução de problemas de carga do sistema operacional é iniciar o
sistema em modo Single-User, que é um nível de serviço em que o sistema carrega
minimamente o necessário. Desta forma, apenas o administrador terá acesso ao sistema
para fazer os reparos necessários.

Esse modo geralmente está disponível no menu do GRUB 2. Caso não esteja disponível,
basta o administrador ao entrar no Menu do GRUB, escolher a imagem do Kernel que deseja
e pressionar a tecla "E", para editar a linha de carga do Kernel, e adicionar a palavra "single".

A palavra "single" na linha de comando do Kernel faz com que o sistema seja carregado com
Runlevel 1, que permite que somente o root tenha acesso ao sistema, com o mínimo de
serviços em execução, e então possa fazer as modificações necessárias no GRUB, módulos
do Kernel ou mesmo no initramfs.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 31


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Passando parâmetros do Kernel


Outro truque que o gerenciador de boot permite é passar outros parâmetros para o kernel no
momento de carga do sistema. Para alterar a temporariamente esses parâmetros, a tecla "E"
no menu do grub deve ser pressionada.

Exemplo parâmetros:

linux16 /vmlinuz-4.2.0-1.fc23.x86_64
root=/dev/mapper/fedora-root ro rd.md=0 rd.dm=0
rd.lvm.lv=fedora/swap crashkernel=auto rd.luks=0
vconsole.keymap=us rd.lvm.lv=fedora/root rhgb quiet

O Kernel aceita alterar os módulos de hardware, alterar parâmetros de acesso ao hardware


como I/O, IRQ, DMA, etc.

Falha de Disco
O pior medo dos administradores é uma falha geral no disco raiz do sistema operacional.
Quando isso acontece, é necessário reiniciar o sistema com um Linux em pendrive ou
LiveCD. Como o Linux é capaz de executar inteiramente a partir de um cartão de memória ou
LiveCD, é possível então usar as ferramentas de reparo de discos para diagnóstico e reparo
da partição raiz.

Nos sistemas de arquivos ext2, ext3 e ext4 a ferramenta de diagnóstico e reparo é o fsck.

Para reparar uma partição de root, que no exemplo, é o dispositivo /dev/sda1, pode-se
utilizar o seguinte comando:

# fsck /dev/sda1

Uma vez reparada a partição de root, ela pode ser montada num ponto de montagem
temporário como o /mnt para testes e averiguações:

# mount /dev/sda1 /mnt

Restaurada a saúde da partição de /root, ela pode ser desmontada, e então o sistema
reiniciado normalmente.

32 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Simulado
1.2 Instalar, Configurar e Monitorar
Módulos do Kernel

O Kernel do Linux possibilita uma arquitetura modular quando se trata de adicionar ou


remover funcionalidades no sistema operacional.

Essas funcionalidades podem ser desde a capacidade de filtrar pacotes de rede através de
um filtro avançado, leitura e gravação de sistemas de arquivos do Windows como FAT,
exFAT, NTFS, bem como reconhecer hardware diferentes.

Esse tipo de arquitetura facilita que essas funcionalidades sejam carregadas na memória
como "drivers", ou pedaços de programa, que adicionam uma habilidade nova ao sistema.

Outra vantagem enorme deste tipo de abordagem é que o sistema operacional fica "leve",
uma vez que ele carrega na memória somente aquilo que é pertinente ao Hardware em que
está sendo executado, bem como somente as funcionalidades que o usuário deseja.

Por exemplo, se você não tem um CD-ROM no seu notebook, prá que carregar um pedaço de
software de leitura de CD-ROM na memória?

Esses pedaços de programa que se ligam ao kernel, são chamados de Módulos do Kernel. O
Linux vem com uma quantidade absurda de Módulos do Kernel, e a cada versão do núcleo,
novos módulos são agregados.

Os fabricantes de Hardware também podem fornecer Módulos do Kernel, geralmente em


código-fonte, para que possam ser compilados para uma determinada versão de Kernel e
arquitetura.

Geralmente os módulos do Kernel podem ser divididos em categorias:

Driver de Dispositivo: facilitam a comunicação e uso do hardware;


I/O Driver: habilitam algum sistema de arquivos específico;
Driver de Rede: implementam protocolos de rede ou filtros;
Chamadas de Sistema: provê alguma funcionalidade adicional ou modifica o sistema;
Formato de executável: habilita a execução de algum tipo de executável;

Os módulos do Kernel geralmente são instalados no diretório /lib/modules, seguido do


subdiretório com o nome e versão do kernel. Cada kernel instalado deve ter os seus módulos
que foram compilados para aquela determinada versão. Também é comum encontrar um link
físico entre o diretório /lib/modules e /usr/lib/modules.

$ ls -l /lib/modules
total 12
drwxr-xr-x 7 root root 4096 Oct 15 01:56

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 33


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

4.14.146-119.123.amzn2.x86_64
drwxr-xr-x 7 root root 4096 Oct 15 01:58
4.19.75-27.58.amzn2.x86_64
drwxr-xr-x 7 root root 4096 Nov 3 01:37
4.19.75-28.73.amzn2.x86_64

Um módulo do Kernel pode requerer que sejam informados parâmetros para o seu
funcionamento correto, como, por exemplo, endereços de memória, IRQ, etc.

Em instalações antigas do Linux, esses parâmetros eram definidos em um arquivo único


localizado em /etc/modules.conf. Nas distribuições modernas, as configurações dos
módulos podem ser encontradas em cinco locais diferentes:

/etc/modprobe.d : contém os arquivos de configuração gerados pela instalação do


sistema ou criados pelo administrador;
/etc/modules-load.d : contém os arquivos de configuração gerados pela instalação
do sistema ou criados pelo administrador;
/lib/modprobe.d : contém os arquivos de configuração gerados por pacotes de
software de terceiros;
/usr/lib/modprobe.d : é um hardlink para /lib/modprobe.d;
/run/modprobe.d : contém arquivos de configuração gerados em execução;

Exemplo de arquivos em /etc/modprobe.d:

$ ls -l /etc/modprobe.d/
-rw-r--r-- 1 root root 87 Jun 21 2018 ixgbevf.conf
-rw-r--r-- 1 root root 746 Aug 17 2018 lockd.conf

A maioria dos módulos do kernel é carregada durante o processo de carga do sistema, ou


quando um hardware é conectado ao computador com o advento do Hotplug.

E para lidar com os módulos do Kernel, o Linux vem com várias ferramentas, entre elas o
modprobe, insmod, rmmod para carregar ou remover módulos da memória, e lsmod, modinfo
e depmod para obter informações sobre os módulos e o dmesg para diagnosticar o processo
de carga do sistema. Vejamos com detalhes cada uma dessas ferramentas:

lsmod
$ lsmod

O lsmod é um utilitário simples que formata o conteúdo do arquivo /proc/modules, mostrando


os módulos do Kernel que estão carregados na memória. É no /proc/modules que o Kernel
mantém uma lista dos módulos que estão em funcionamento.

34 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Veja um exemplo:

$ lsmod
Module Size Used by
binfmt_misc 20480 1
tun 36864 2
ext4 724992 1
ip_tables 28672 0
aes_x86_64 20480 1
cryptd 28672 3
ipv6 524288 52
autofs4 49152 2

modprobe
# modprobe módulo

O modprobe adiciona ou remove um módulo no Kernel do Linux. Ele procura por módulos no
diretório /lib/modules/versão_do_kernel. Estes módulos podem ser drivers de dispositivos,
suporte a sistemas de arquivos ou mesmo funções específicas, como criptografia.

Além do nome do módulo, o modprobe aceita parâmetros que podem ser passados ao Kernel
para o correto funcionamento do dispositivo ou funcionalidade.

Seu uso é muito simples, basta informar o nome do módulo do kernel qu se deseja:

# modprobe ipv6

Carrega o módulo de suporte ao IPv6.

# modprobe –r ipv6

Remove o módulo de suporte ao IPv6.

insmod
# insmod [arquivo] [opções.]

O comando insmod é uma versão mais simples do modprobe. Ele insere um módulo no
kernel do Linux.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 35


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Diferentemente do modprobe, ele requer que o caminho completo do arquivo do módulo


senha informado como parâmetro. Ele também aceita que os parâmetros do módulo sejam
informados.

Esse comando é útil para carregar um módulo avulso, como um driver de placa de vídeo ou
som.

Exemplo:

# insmod
/lib/modules/4.19.75-28.73.amzn2.x86_64/kernel/net/dns_resolver/d
ns_resolver.ko

rmmod
# rmmod módulo

O comando rmmod pode ser usado para remover um módulo do kernel da memória. Ele
aceita como parâmetro o nome do módulo do kernel.

É importante dizer que somente os módulos que não estão em uso é que podem ser
removidos com segurança. No entanto, o rmmod possui a opção "-f" que força a remoção do
módulo mesmo que ele esteja a ser utilizado.

O comando rmmod é análogo ao "modprobe -r".

Exemplo:

# rmmod tcp_diag

Observe que o lsmod possui uma coluna que indica que o módulo está ou não em uso. O zero
indica que o módulo pode ser removido.

$ lsmod
Module Size Used by
tcp_diag 16384 0

modinfo
$ modinfo módulo

O comando modinfo extrai informações dos módulos do Kernel Linux. Assim como o

36 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

modprobe, ele aceita o nome do módulo como parâmetro, fazendo uma busca no diretório
/lib/modules/versão_do_kernel, ou o caminho completo do arquivo do módulo.

Exemplo:

$ modinfo dns_resolver
filename:
/lib/modules/4.19.75-28.73.amzn2.x86_64/kernel/net/dns_resolver/
dns_resolver.ko
license: GPL
license: GPL
author: Wang Lei
description: DNS Resolver
srcversion: 7AE260956B8DD39F0EF0D6C
depends:
retpoline: Y
intree: Y
name: dns_resolver
vermagic: 4.19.75-28.73.amzn2.x86_64 SMP mod_unload
modversions
sig_id: PKCS#7
signer:
sig_key:
sig_hashalgo: md4

depmod
$ depmod [opções]

Os módulos do kernel Linux podem fornecer serviços (chamados de “símbolos”) para outros
módulos usarem. Os símbolos são como funções de uma biblioteca de programação.

Então, por exemplo, um módulo de filtro de pacotes pode depender de funções que um
módulo de IPv6 fornece. Essa relação entre as funções ou símbolos que um módulo provê
para outro precisa ser documentada pelo sistema, de forma que os módulos possam interagir
e funcionar corretamente.

O comando depmod é responsável por criar essa lista de dependências entre os módulos
lendo cada módulo no diretório /lib/modules/versão_do_kernel e determinando quais símbolos
ele exporta e quais ele precisa.

Por padrão, essa lista de símbolos e dependências é gravada no arquivo modules.dep, e


uma versão binária hash chamada modules.dep.bin, no mesmo diretório dos módulos em

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 37


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

/lib/modules/versão_do_kernel.

Exemplo:

$ sudo depmod

Quando um módulo do kernel é carregado, o sistema consulta o arquivo modules.dep.bin,


e carrega o módulo dependente necessário.

O comando lsmod também fornece uma lista dos módulos dependentes:

$ lsmod
Module Size Used by
cryptd 24576 3
crypto_simd,ghash_clmulni_intel,aesni_intel
ip_tables 28672 1 iptable_filter

dmesg
$ dmesg [opções]

Como os módulos do kernel são lidos geralmente na carga do sistema operacional, se você
precisar fazer um diagnóstico, é necessário usar uma ferramenta para ter acesso às
mensagens que o kernel produz durante o processo de carga do sistema.

O dmesg é o utilitário capaz de ler o "anel de buffer" (pequena área de memória) das telas do
processo de carga do sistema, chamado de dmesg. Após o processo de carga do sistema
este utilitário irá mostrar as mensagens de carga do sistema, mas ele é capaz de ler qualquer
mensagem importante que o Kernel armazene em seu buffer.

O kernel também mantém uma cópia das informações do buffer em /var/log/dmesg.

Suas opções mais comuns são

-C, --clear Limpa o buffer


-c, --read-clear Limpa o buffer DEPOIS de mostrar seu conteúdo
-e, --reltime Mostra as horas em formato humano

$ dmesg
[ 0.000000] Linux version 4.14.133-113.112.amzn2.x86_64
[ 0.000000] Command line:
BOOT_IMAGE=/boot/vmlinuz-4.14.amzn2.x86_64
root=UUID=8a9e0fcb-f415-4a3f-931d-919fadf8e22c ro console=tty0
KEYTABLE=us
38 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

[ 0.000000] x86/fpu: Supporting XSAVE feature 0x001: 'x87


floating point registers'
[ 0.000000] x86/fpu: Supporting XSAVE feature 0x002: 'SSE
registers'
[ 0.000000] x86/fpu: Supporting XSAVE feature 0x004: 'AVX
registers'
[ 0.000000] x86/fpu: xstate_offset[2]: 576, xstate_sizes[2]:
256
[ 0.000000] x86/fpu: Enabled xstate features 0x7
[ 0.000000] e820: BIOS-provided physical RAM map:
[ 0.000000] BIOS-e820: [mem
0x0000000000000000-0x000000000009dfff] usable
[ 0.000000] BIOS-e820: [mem
0x000000000009e000-0x000000000009ffff] reserved
[ 0.000000] BIOS-e820: [mem
0x00000000000e0000-0x00000000000fffff] reserved

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 39


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Simulado
1.3 Configurar e verificar parâmetros
de conexão de rede

Impossível pensar num Linux que não esteja conectado à Internet, salvo algum sistema
embarcado antigo.

Para colocar um Linux conectado a uma rede baseada em TCP/IP, são necessárias as
seguintes configurações:

1. Endereço do IP;
2. Máscara de subrede;
3. IP do gateway padrão (Default Gateway);
4. Hostname do sistema;
5. Endereço do servidor de resolução de nomes (DNS);

Há três maneiras de configurar ou alterar as configurações de Rede do Linux:

1. Alterar manualmente os arquivos no terminal do Linux;


2. Usar uma ferramenta gráfica que acompanha o ambiente gráfico;
3. Usar comandos do terminal que alteram as configurações;

Infelizmente não há um único padrão de arquivos de configuração de Interface de rede


comum à todas as distribuições. Desta forma, os arquivos que armazenam as configurações
das interfaces de rede do Linux vão depender da distribuição:

Distribuição Localização

Baseado em Debian /etc/network/interfaces

Baseado em Redhat /etc/sysconfig/network-scripts

OpenSuSE /etc/sysconfig/network

Ubuntu (versão > 17.04) /etc/netplan

Pelo menos nos Linux baseados em Debian, Redhat e OpenSuSe, os arquivos são parecidos
nas funcionalidades que podem oferecer, e o seu formato também é parecido: uma tag por
linha, seguido da configuração que essa tag provê. Já o Ubuntu desde a versão 17.04, decidiu
mover a configuração de rede para um diretório diferente do Debian, (/etc/netplan) e
também a utilizar um formato diferente (YAML), e utiliza o NetworkManager para alterar as
configurações.

Em algumas situações especiais, o endereçamento de IP pode ser feito automaticamente


através de um serviço chamado DHCP (Dynamic Host Configuration Protocol). O DHCP é um
protocolo de serviço TCP/IP que oferece configuração dinâmica de terminais e máquinas, com
concessão de endereços IP de host, Máscara de sub-rede, Default Gateway (Gateway
Padrão), Número IP de um ou mais servidores DNS, Número IP de um ou mais servidores
40 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

WINS e Sufixos de pesquisa do DNS.

O serviço de DHCP pode ser oferecido por um servidor na rede, que fica “escutando”
requisições de endereçamento na rede, e responde com os dados necessários à conexão.
Então a máquina que requisitou o endereço IP, máscara, gateway padrão e servidores DNS
procede com a configuração automática.

O serviço de DHCP mantém uma tabela de qual endereço IP foi designado para qual cliente e
por quanto tempo. Este serviço é extremamente útil para administrar a rede local.

Exceto para servidores e hardwares de rede (exemplo: hotspots wifi e switches) é raro
encontrar uma rede em que os endereços IP sejam atribuídos manualmente, de forma que o
DHCP é muito utilizado.

Exemplo de arquivo de configuração de rede do CentOS:

$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
TYPE=Ethernet
USERCTL=yes
PEERDNS=yes
DHCPV6C=yes
DHCPV6C_OPTIONS=-nw
PERSISTENT_DHCLIENT=yes
RES_OPTIONS="timeout:2 attempts:5"
DHCP_ARP_CHECK=no

Neste exemplo o CentOS está usando a configuração de endereços IP automática por DHCP.

Exemplo de configuração estática no Debian:

auto eth0
iface eth0 inet static
address 192.168.0.2
netmask 255.255.255.0
gateway 192.168.0.254

Exemplo de configuração dinâmica no Debian:

auto eth0
iface eth0 inet dhcp
iface eth0 inet6 dhcp

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 41


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Nas distribuições baseadas em RedHat, as configurações da interface de rede ficam no


diretório /etc/sysconfig/network-scripts, e o arquivo de configuração de interface terá o nome
"if-cfg-nomedainterface". Nestas distribuições, as informações de gateway fica em outro
arquivo:

NETWORKING=yes
HOSTNAME=host1.certificacaolinux.com.br
GATEWAY=192.168.0.1

Configurando Wifi
Antes de configurar endereços de rede para dispositivos Wifi, é necessário designar uma
rede Wireless com o SSID e a chave de criptografia.

Isso pode ser feito utilizando a Central de Controle do Linux, alterando as configurações de
rede, ou manualmente com o comando iwconfig.

Nem todas as distribuições tem instalados por padrão as ferramentas de Wireless em linha
de comando, como é o caso do CentOS. Para instalar o utilitário iwconfig e iwlist, instale o
pacote "wireless-tools".

iwconfig

O comando iwconfig recebe como parâmetros a interface de rede wireless, nome da rede
SSID e a senha.

# iwconfig wlp6s0 essid "MinhaCasa" key s:Senhasecreta

Neste exemplo, a interface de rede wifi é a wlp6s0, a palavra essid serve para especificar o
SSID "MinhaCasa" e a palavra key especifica a senha. O "s:" especifica que a senha será
informada em ASCII, caso contrário, a senha deverá ser especificada em Hexadecimal.

iwlist

Se você não souber o nome da rede wifi, uma lista de redes disponíveis ao alcance do
computador pode ser obtida com o comando "iwlist":

$ iwlist wlp60s scan

Resolução de Nomes

Há outros arquivos importantes da configuração de rede que configuram a resolução de


nomes.

42 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

/etc/hostname
Este arquivo contém o nome do sistema. Em algumas distribuições, existe o arquivo
/etc/HOSTNAME que é um link simbólico para o /etc/hostname.

$ cat /etc/hostname
linux.home.com.br

/etc/hosts
Este arquivo faz o mapeamento entre endereços IP e nomes de máquinas na rede e é
utilizado para resolução de nomes durante o processo de boot enquanto nenhum servidor de
DNS entrou em ação.

Este arquivo também serve para fazer a resolução de nomes de forma estática.

Se você quiser alterar a resolução de nomes de um determinado endereço para outro IP (por
exemplo para testar algo num servidor de desenvolvimento), pode alterar no arquivo
/etc/hosts.

$ cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 ubuntu
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
10.211.55.50 centos

/etc/resolv.conf
Este arquivo especifica o endereço IP de um ou mais servidores de DNS para resolução de
nomes.

$ cat /etc/resolv.conf
nameserver 192.168.1.1
nameserver 192.168.1.200
search certificacaolinux.com.br

Você pode especificar o endereço IP dos servidores de DNS que a máquina irá utilizar com a
palavra nameserver seguida do endereço IP.

A chave search determina que uma busca por hosts pode ser passada sem a necessidade de
se escrever o domínio inteiro.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 43


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

/etc/nsswitch.conf
O Linux mantém um serviço chamado Name Server Switch, que é utilizado pelas bibliotecas
de programação em GNU C para determinar quais são as fontes de informação para
resolução de nomes e em qual ordem.

Ele contém apelidos (passwd, group, hosts, network, etc.) que na verdade são
relacionados a funções na biblioteca de programação. Cada apelido pode estar relacionado a
uma ou mais funções de programação.

Em seguida ao apelido, é destacado qual será a origem da resolução de nomes. Se mais de


uma origem for especificada, a ordem determina a sequência de resolução de nomes.

Por exemplo:

networks: files dns

Isto diz ao sistema que as funções getnetent(), getnetbyname(), getnetbyaddr(), setnetent()


e endnetent() irão consultar primeiro o arquivo /etc/hosts e depois o DNS.

Este arquivo é a evolução do /etc/host.conf e possibilita que a ordem de procura para


resolução de nomes seja customizada para cada serviço ou conjunto de funções na biblioteca
de programação GNU C. Ele é utilizado nas últimas distribuições por diversas bibliotecas ao
invés do /etc/host.conf (não confunda com /etc/hosts).

$ cat /etc/nsswitch.conf
passwd: compat
group: compat
hosts: files dns
networks: files dns
services: files
protocols: files
rpc: files
ethers: files
netmasks: files
netgroup: files
publickey: files

Configurar o Cliente DNS

O DNS – Domain Name System é utilizado para resolução de nomes para endereços IP e vice-
versa.

44 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

A implementação do serviço de resolução de nomes é feita pelo pacote BIND ou outros


pacotes de servidor de DNS. Este pacote possui os arquivos necessários à configuração do
DNS e o serviço chamado named.

O DNS é estruturado sobre dois pontos básicos, a organização da Internet em domínios e a


distribuição dos servidores de nomes na rede em forma de hierarquia.

A organização da Internet em domínios evita a utilização de um mesmo nome por mais de


um equipamento e descentraliza o cadastro de redes e equipamentos.

Os domínios podem ser hierarquizados por instituições e geograficamente.

A distribuição dos servidores DNS faz-se necessária uma vez que a centralização de uma
única base de dados contendo as informações para a conversão dos nomes simbólicos em
endereços IP seria inviável.

A própria Internet nasceu de um projeto chamado ARPANET, criado pelo Departamento de


Defesa americano, que preconizava uma rede sem um backbone central e sem
administração centralizada, tornando-a virtualmente indestrutível caso algum computador,
ou pedaço da rede se tornasse inoperante.

Na internet existem diversos servidores raízes geograficamente espalhados e organizados


através de sufixos. Por exemplo, os servidores raiz do sufixo .br ficam hospedados no
registro.br. Os servidores raiz do registro.br precisam conhecer todos os servidores DNS
que hospedam domínios terminados com .br.

Há 3 arquivos de configuração importantes para a resolução de nomes, já citados no livro:

/etc/nsswitch.conf: Este arquivo possui uma linha com o comando "hosts" que
determina a ordem de busca para resolução de nomes. A tag "files" determina que o
/etc/hosts seja consultado e a tag "dns" determina que o arquivo /etc/resolv.conf seja
consultado para determinar o IP do servidor de DNS.
/etc/resolv.conf: Este arquivo possui uma linha com o comando nameserver que
determina o IP do servidor de DNS;
/etc/hosts: Este arquivo pode conter algumas resoluções de nomes em IPs de forma
manual;

Ao acessar a Internet através de um navegador ou qualquer outro aplicativo de rede, o host


Linux segue a seguinte sequência para identificar o endereço IP do nome de endereço de
Internet desejado:

1. O Linux verifica o arquivo /etc/nsswitch.conf para saber a ordem de busca: se é em


arquivo (/etc/hosts) ou por servidor de DNS (/etc/resolv.conf).
2. Se a ordem em /etc/nsswitch.conf for primeiro "files", o arquivo /etc/hosts é
consultado para se tentar determinar a resolução do nome. Se a ocorrência for
encontrada, o endereço IP será retornado. Caso não encontre, o host irá ler o endereço
IP do servidor de DNS no arquivo /etc/resolv.conf e fará uma consulta ao servidor de
DNS para tentar determinar o IP do endereço desejado. Se o servidor retornar um
endereço IP, o nome será resolvido. Caso contrário, a aplicação receberá uma falha de
resolução de nomes.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 45


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

3. Se a ordem em /etc/nsswitch.conf for primeiro "dns", o arquivo /etc/resolv.conf é


consultado para pegar o endereço IP do servidor de DNS e uma consulta será feita ao
servidor de DNS para tentar determinar o IP do endereço desejado. Se o servidor de
DNS encontrar o endereço, a aplicação receberá o IP desejado. Caso contrário, o host
irá acessar o arquivo /etc/hosts para tentar determinar o IP do endereço desejado. Caso
encontre, o IP será retornado. Em caso negativo a aplicação receberá uma falha de
resolução de nomes.

Exemplo de configuração do /etc/nsswitch.conf

passwd: files systemd


group: files systemd
shadow: files
gshadow: files
hosts: files dns
networks: files

Exemplo de configuração básica do arquivo /etc/resolv.conf:

search meudominio.com.br
nameserver 10.25.12.1
nameserver 200.216.215.5

Exemplo de configuração básica do arquivo /etc/hosts:

127.0.0.1 localhost.localdomain localhost


10.25.12.1 www.certificacaolinux.com.br www

É importante que você entenda o funcionamento do processo de resolução de nomes, que os


arquivos /etc/hosts, /etc/nsswitch.conf, /etc/resolv.conf regulam a configuração do cliente de
DNS.

É importante saber que a ordem de resolução de nomes no arquivo /etc/nsswitch.conf afeta


como a resolução de nomes se comportará. Assim que uma ocorrência de resolução de
nomes é encontrada, seja no servidor de DNS ou localmente no arquivo /etc/hosts, o host se
dá por satisfeito e não recorre a outro serviço.

Com isso, pode-se ter os seguintes casos de erro:

Pode existir um endereço listado no /etc/hosts manualmente, que difere do endereço


IP que os servidores de DNS resolvem. Isso pode fazer com que o host conecte em um
servidor errado, ou mesmo não consiga conectar porque o endereço IP não existe;
Um determinado servidor de DNS listado no /etc/resolv.conf não está ativo ou o host
não consegue uma conexão com ele, impossibilitando a resolução de nomes;

46 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Network Manager

O Network Manager é um gerenciador de redes que provê a detecção e configuração


automática de redes para computadores. As suas funcionalidades são úteis para configurar
redes sem fio e cabeadas. Nas redes sem fio, o Network Manager faz a gestão dos roteadores
Wifi que já conhece, e possui a habilidade para trocar para a rede mais confiável sempre que
disponível.

O Network Manager pode ser instalado com o pacote networkmanager, que contém um
serviço, e um utilitário cliente de linha de comando chamado nmcli.

nmcli

Este utilitário pode ser utilizado para configurar redes cabeadas e sem fio do Linux, através
do serviço do Network Manager.

Quando executado sem nenhum parâmetro, ele exibe as configurações de rede de forma
bem completa, exibindo todas as interfaces de rede, tipo de conexão (wifi ou
cabeada), endereços de rede IPv4 e IPv6, tabela de rotas e servidores de DNS:

$ nmcli
enp0s5: connected to Wired connection 1
"Red Hat Virtio"
ethernet (virtio_net), 00:1C:42:9A:79:77, hw, mtu 1500
ip4 default, ip6 default
inet4 10.211.55.63/24
route4 0.0.0.0/0
route4 10.211.55.0/24
route4 169.254.0.0/16
inet6 fdb2:2c26:f4e4:0:84ad:e164:108c:46ea/64
inet6 fdb2:2c26:f4e4:0:9d68:7860:3e7d:41a3/64
inet6 fe80::abfe:c9a1:d0aa:a394/64
route6 fe80::/64
route6 fdb2:2c26:f4e4::/64
route6 ::/0
route6 ff00::/8
lo: unmanaged
"lo"
loopback (unknown), 00:00:00:00:00:00, sw, mtu 65536
DNS configuration:
servers: 10.211.55.1
domains: localdomain
interface: enp0s5
servers: fe80::21c:42ff:fe00:18

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 47


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

interface: enp0s5

Para listar as redes wifi próximas:

$ nmcli device wifi list

Para se conectat à uma rede wifi, basta informar o SSID da rede (nome) e a senha do Wifi:

$ nmcli device wifi connect SSID password senha

Para desligar o wifi:

$ nmcli radio wifi off

Para alterar uma configuração, deve-se primeiro listar as conexoes com o


parâmetro connection:

$ nmcli connection
NAME UUID TYPE
DEVICE
Wired connection 1 b7603264-e0c6-30e6-9b06-a626a568f0b7
ethernet enp0s5

Depois de identificar o nome da conexão, deve-se editar a configuração com o parâmetro


"connection edit" seguido do nome da conexão:

$ nmcli connection edit "Wired connection 1"


===| nmcli interactive connection editor |===
Editing existing '802-3-ethernet' connection: 'Wired connection
1'

Assim, o nmcli trará um console interativo, onde será possível modificar os parâmetros.

Para alterar um parâmetro, deve-se usar o a sequencia


"configuração.propriedade valor".

Exemplo:

set ipv4.dns 8.8.8.8

Uma configuração também pode ser alterada diretamente no prompt do shell, com o

48 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

comando:

$ nmcli c modify "Wired connection 1" ipv4.dns "8.8.8.8"

É possível alterar uma infinidade de parâmetros com o nmcli. Veja a lista de parâmetros
possíveis com o comando

$ nmcli c show "Wired connection 1"

O NetworkManager possui outros utilitários que podem ser utilizados para configurar a rede:

Aplicação ou
Descrição
ferramenta

nmcli Ferramenta de linha de comando que permite que usuários e scripts interajam com o
NetworkManager. Observe que o nmcli pode ser usado em sistemas sem uma
interface gráfica, como servidores, para controlar todos os aspectos do
NetworkManager . Ele tem a mesma funcionalidade que as ferramentas gráficas.

nmtui Uma interface de usuário de texto simples baseada em curses (TUI) para o
NetworkManager.

nm-editor de Uma ferramenta de interface gráfica do usuário para determinadas tarefas ainda não
conexão tratadas pelo utilitário de central de controle, como configurar vínculos e conexões de
agrupamento. Você pode adicionar, remover e modificar conexões de rede armazenadas
pelo NetworkManager. Para iniciá-lo, digite nm-connection-editor em um terminal:
$ nm-connection-editor

centro de Uma ferramenta de interface gráfica de usuário fornecida pelo GNOME Shell, disponível
controle para usuários de desktop. Ele incorpora uma ferramenta de configurações de rede.

ícone de Uma ferramenta de interface gráfica do usuário fornecida pelo Shell do GNOME
conexão de rede representando estados de conexão de rede conforme relatado pelo NetworkManager.
O ícone tem vários estados que servem como indicadores visuais para o tipo de conexão
que você está usando no momento.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 49


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Figura 5 - nm-connection-editor

Figura 6 - nmtui

50 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Figura 7 - Central de Controle

ip
# ip [ opções ] Objeto { comando }

Este comando é uma poderosa ferramenta para mostrar e manipular as interfaces de rede,
configurar endereços IP, alterar as tabelas de rotas e criar túneis.

Com este comando é possível inserir ou alterar entradas na tabela de rotas, adicionar ou
modificar a rota padrão e também configurar endereços de rede.

Este comando substituí os comandos do Net-Tools ifconfig e route.

Os objetos com que o comando ip pode trabalhar são: link, addr, addrlabel, route, rule,
neigh, ntable, tunnel, tuntap, maddr, mroute, mrule, monitor, xfrm, netns, l2tp,
tcp_metrics, token e netconf.

Para o exame é necessário saber como funcionam os objetos addr (que configuram o
endereço IP), link (que habilita uma interface) e route (que modifica a tabela de rotas).

A primeira função do ip é mostrar o endereço IP das interfaces do host. Utiliza-se o comando


ip seguido do objeto addr:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 51


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host

2: enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500


link/ether 00:26:55:04:d3:95 brd ff:ff:ff:ff:ff:ff
inet 172.19.1.34/20 brd 172.19.15.255 scope global enp0s25
inet6 fe80::226:55ff:fe04:d395/64 scope link

O comando ip pode ser utilizado para designar um endereço IP ao host, utilizando o objeto
addr, seguido da palavra add:

# ip addr add 192.168.50.5 dev eth1

Neste caso será atribuído o IP 192.168.50.5 à interface eth1. Você pode ou não informar o
tamanho da rede na notação CIDR:

# ip addr add 192.168.50.5/24 dev eth1

A mesma ideia pode ser utilizada para apagar um endereço IP de uma determinada interface,
com o objeto addr e o comando del:

# ip addr del 192.168.50.5/24 dev eth1

Para habilitar uma interface, utilizamos o objeto link, seguido da palavra set, o nome da
interface e o comando up:

# ip link set eth1 up

Para desabilitar uma interface, o mesmo, mas com o comando down:

# ip link set eth1 down

Para verificar a tabela de rotas do host, você pode usar o objeto route:

# ip route
default via 172.19.1.1 dev enp0s25
172.19.0.0/20 dev enp0s25 proto kernel scope link src

52 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

172.19.1.34

Para adicionar uma rota estática na tabela de rotas, utiliza-se também o objeto route,
seguido da palavra add, a rede que se deseja adicionar e a interface e gateway em que ela
está conectada:

# ip route add 10.10.20.0/24 via 172.19.1.10 dev enp0s25

Neste exemplo, será adicionada a rede 10.10.20.0/24 cujo gateway será o endereço
172.19.1.10, que está conectado na interface enp0s25.

Ao listar novamente a tabela de rotas:

# ip route show
default via 172.19.1.1 dev enp0s25
10.10.20.0/24 via 172.19.1.10 dev enp0s25
172.19.0.0/20 dev enp0s25 proto kernel scope link src
172.19.1.34

O mesmo raciocínio vale para remover uma rota da tabela de rotas:

# ip route del 10.10.20.0/24

Ainda é possível adicionar uma rota padrão na tabela de rotas, utilizando o objeto route,
seguido de add e a palavra default, seguido do endereço IP do gateway padrão:

# ip route add default via 192.168.50.100

As ferramentas ifconfig, route e netstat que fazem parte do pacote legado Net-Tools tem
paralelo na ferramenta ip do iproute2, a seguir:

Net-Tools Iproute2 Descrição

ifconfig -a ip link show Exibe todas as interfaces de rede

ifconfig eth1 up ip link set up eth1 Habilita interface de rede

ifconfig eth1 down ip link set down eth1 Desabilita interface de rede

ifconfig eth1 192.168.0.1/24 ip addr add 192.168.0.1/24 dev Defini IP/Mascára de rede
eth1

ifconfig eth1 0 ip addr del 192.168.0.1/24 dev eth1 Remove definição de IP/Mascára
de rede

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 53


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Net-Tools Iproute2 Descrição

ifconfig eth1 ip addr show dev eth1 Mostra Informações específicas


de uma interface

ifconfig eth1 hw ether ip link set dev eth1 address Altera o MAC-ADDRESS
00:52:bc:33:25:a1 00:52:bc:33:25:a1

route -n ou netstat -rn ip route show Exibe a tabela de roteamento

route add default gw 192.168.0.1 ip route add default via 192.168.0.1 Adiciona a rota padrão

route add -net 192.168.0.0/24 ip route add 192.168.0.0/24 dev Adiciona uma rota estática
eth1 eth1

route del -net 192.168.0.0/24 ip route del 192.168.0.0/24 Exclui uma rota estática

route del default ip route del default Exclui a rota padrão

Tabela de Rotas

Para que as redes se interliguem e formem a Internet, cada dispositivo que interliga as
diferentes redes (conhecidos como gateways ou roteadores) é dotado de uma tabela de
rotas. Essa tabela de rotas especifica qual rede é conectada em qual interface do roteador.

Uma situação especial desta tabela é a rota padrão. Esta rota padrão diz ao roteador qual
será a interface para qual os pacotes deverão ir quando nenhuma ocorrência da tabela de
rotas satisfaz o destino do pacote. Na tabela de rotas convencionou-se o endereço 0.0.0.0/0
como sendo da rota padrão. Na notação CIDR o 0.0.0.0/0 significa “todo o resto” ou “todas as
outras redes”.

Quando uma máquina transmite um pacote para outra máquina que não pertence à rede
local, ele é entregue para o roteador da rede. O roteador consulta sua tabela de rotas para
determinar de qual rede é o pacote. Se a rede à qual o pacote pertence não está na lista, o
pacote é entregue na interface indicada na rota padrão, que muito provavelmente é um
outro roteador ao qual o link está conectado.

Desta forma o pacote vai caminhando de roteador em roteador, até chegar na rede de
destino e então é entregue ao destinatário. Cada roteador por que o pacote passa é chamado
de salto ou hops. Convencionou-se na rede IPv4 que um máximo de 32 saltos atinja 99% de
alcance.

Cada vez que um pacote passa por um salto, é incrementado um contador especial no
pacote que conta quantos saltos ele já deu. Se um pacote não é entregue em até 32 saltos,
ele pode ser descartado pelo próximo roteador que passar, de forma que não fique vagando
eternamente na Internet.

54 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

route
$ route [opções] comando alvo

O comando route manipula a tabela de roteamento IP do kernel. Seu principal uso é


configurar rotas estáticas para hosts ou redes especificadas através de uma interface, após
a mesma ter sido configurada com o programa ip.

Tudo que o comando route faz pode ser realizado pelo comando ip.

Se o route for utilizado sem nenhuma opção, exibe a tabela de rotas.

$ route
Tabela de Roteamento IP do Kernel
Destino Roteador MáscaraGen. Opções Métrica
Ref Uso Iface
default ip-172-30-0-1.e 0.0.0.0 UG 0 0
0 eth0
10.8.0.0 ip-10-8-0-2.ec2 255.255.255.0 UG 0 0
0 tun0
ip-10-8-0-2.ec2 0.0.0.0 255.255.255.255 UH 0 0
0 tun0
instance-data.e 0.0.0.0 255.255.255.255 UH 0 0
0 eth0
172.30.0.0 0.0.0.0 255.255.255.0 U 0 0
0 eth0

A mesma informação pode ser vista com o comando ip:

$ ip route show
default via 172.30.0.1 dev eth0
10.8.0.0/24 via 10.8.0.2 dev tun0
10.8.0.2 dev tun0 proto kernel scope link src 10.8.0.1
169.254.169.254 dev eth0
172.30.0.0/24 dev eth0 proto kernel scope link src 172.30.0.46

As opções mais frequentes são:

-n: Não resolve os nomes ao exibir a tabela de rotas;


-net: Especifica que a rota a ser adicionada ou apagada é uma rede inteira;
-host: Especifica que a rota a ser adicionada ou apagada é para uma máquina
somente;

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 55


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

-C: Exibe o cache de rotas do Kernel.

Para adicionar uma rota, utiliza-se o parâmetro "add" e para remover uma rota, utiliza-se o
parâmetro "del".

As opções para os parâmetros add e del são:

netmask máscara: Especifica a máscara de sub-rede para um determinado destino;


gw endereço: Especifica o gateway que será utilizado para alcançar uma
determinada máquina ou rede.

Ao exibir a tabela de rotas, os seguintes identificadores (flags) serão utilizados:

U: A rota está ativa;


H: O destino é uma máquina (host);
G: Use o gateway;
R: Rota dinâmica;
D: Rota dinâmica criada por um serviço;
M: Rota modificada por um serviço;
!: Rota rejeitada.

Para adicionar uma nova rota com o comando route, utilizamos o parâmetro add:

# route add -net 192.168.3.0 netmask 255.255.255.0 gw


192.168.3.10

Para apagar uma determinada rota, utiliza-se o route seguido do comando del e a
informação da rede que se deseja apagar:

# route del -net 10.10.20.0 netmask 255.255.255.0

Uma rota padrão também pode ser adicionada com o route, seguindo do comando add, a
palavra default e o endereço do gateway padrão:

# route add default gw 192.168.1.10

Em algumas distribuições, o pacote Net-Tools que contém o comando route sequer é


instalado como padrão, sendo preferido o pacote iproute2 que contém o comando "ip".

Ferramentas de Diagnóstico

Faz parte do contexto do exame as ferramentas de diagnóstico de problemas de rede.

56 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

ping e ping6
# ping ip

O comando ping utiliza o protocolo ICMP para enviar mensagens ECHO REQUEST e receber
ECHO RESPONSE para testar a conexão entre o sistema e outra máquina na rede.

Ele retorna o tempo de resposta que um pacote de rede demora para ir e voltar. Muito útil
para realizar o diagnóstico de uma conexão. O ping irá testar indefinidamente até que o Crtl-
c seja pressionado.

O ping também possui uma versão para o IPv6, chamada de ping6. Seu funcionamento é
similar ao ping do IPv4.

As opções mais frequentes são:

-c num: Esta opção faz com que o ping teste a conexão um deteminado número de
vezes.
-q: Esta opção faz com que o ping somente apresente a estatística final do teste de
conexão.

Exemplo:

$ ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.175 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.120 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.115 ms
— 192.168.1.1 ping statistics —
5 packets transmitted, 5 received, 0% packet loss, time 4000ms
rtt min/avg/max/mdev = 0.115/0.128/0.175/0.026 ms

O ping é muito utilizado para testar se uma máquina está conectada na rede local ou se ela é
alcançável na rede remota. Para que o ping funcione corretamente, a rede em questão não
deve ter nenhum filtro de ICMP, especialmente os tipos ECHO REQUEST e ECHO RESPONSE.

O comando ping pode indicar os seguintes possíveis problemas de rede:

Problema com a Resolução de Nomes:

Se ao executar o ping em um determinado host utilizando um nome de rede


(host.certificacaolinux.com.br) o ping demorar para responder, e não conseguir resolver o
nome para o IP, significa que:

O servidor de DNS pode estar errado (verifique o arquivo /etc/resolv.conf);

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 57


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

O servidor de DNS não pode ser acessado (faça um ping com o IP do servidor de
DNS);
Existe um filtro de porta UDP 53 entre o computador e o servidor de DNS (verifique o
iptables);

Problema de Conectividade:

Se ao executar o ping, um determinado host não responder, pode significar que:

O host destino está fora do ar;


Não há rota entre a rede do computador e o host destino (verifique a tabela de rotas);
O default gateway está errado (verifique a tabela de rotas);
O Network Address Translation está com algum problema de encaminhamento ou
tradução de endereços (verifique o firewall);
Existe um filtro de ICMP ECHO e ECHO-REPLY na rede;

netstat
$ netstat [opções]

O comando netstat faz parte do antigo pacote legado Net-Tools e exibe as conexões de rede,
tabela de rotas, estatísticas das interfaces etc. Ele foi elegantemente substituído pelo
comando "ss".

As opções mais frequentes do netstat são:

-c: Esta opção habilita o netstat a trabalhar em modo contínuo, atualizando as


informações a cada segundo;
-i: Esta opção lista as interfaces e as estatísticas;
-n: Esta opção desabilita a resolução de nomes;
-p: Mostra os processos responsáveis por serviços de rede. Disponível somente para o
super-usuário root.
-r: Esta opção exibe a tabela de rotas;
-a: Mostra todas as conexões.

Exemplos:

# netstat -anp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address
Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN
981/mysqld
58 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

tcp 0 0 0.0.0.0:8080 0.0.0.0:*


LISTEN 24929/mini-apache:
tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN
2160/httpd
tcp 0 0 0.0.0.0:3128 0.0.0.0:* LISTEN
1994/(squid)
tcp 0 0 127.0.0.1:953 0.0.0.0:*
LISTEN 935/named

Neste exemplo o comando netstat lista todas as conexões abertas e processos que estão à
escuta de conexões e à qual processo eles pertencem. A opção "-p" somente mostra os
programas "donos" das conexões para o root.

A opção -i fornece uma estatística de volume de dados trafegados em cada interface:

$ netstat -i
Tabela de Interfaces do Kernel
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-
DRP TX-OVR Flg
eth0 9001 34849988 0 0 0 30552900 0
0 0 BMRU
lo 65536 4407543 0 0 0 4407543 0
0 0 LRU

A opção "-r" mostra a tabela de rotas, bem parecido com o comando route:

$ netstat -rn
Tabela de Roteamento IP do Kernel
Destino Roteador MáscaraGen. Opções MSS
Janela irtt Iface
0.0.0.0 172.30.0.1 0.0.0.0 UG 0 0
0 eth0
10.8.0.0 10.8.0.2 255.255.255.0 UG 0 0
0 tun0
10.8.0.2 0.0.0.0 255.255.255.255 UH 0 0
0 tun0
169.254.169.254 0.0.0.0 255.255.255.255 UH 0 0
0 eth0
172.30.0.0 0.0.0.0 255.255.255.0 U 0 0
0 eth0

O netstat também provê estatísticas das interfaces de rede com a opção "-s":

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 59


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

$ netstat -s
Ip:
8871 total packets received
0 forwarded
0 incoming packets discarded
7997 incoming packets delivered
5023 requests sent out
( ... )

ss
$ ss [opções]

O comando ss é extremamente útil para investigar os sockets, fornecendo várias


informações sobre a rede. Ele é a evolução do comando netstat do antigo Net-tools. É
importante que se entenda que um socket pode ser uma conexão de rede, bem como um
socket do tipo Unix, que é um arquivo especial que atua como "ponte de comunicação" entre
dois programas.

Suas opções mais comuns são:

-a: lista todos sockets;


-r: resolve os endereços IPs e portas por nomes de serviços;
-n: não resolve os endereços IPs e portas para serviços;
-l: lista somente as portas abertas (LISTEN);
-e: mostra informações detalhadas sobre o socket;
-m: mostra a alocação de memória do socket;
-p: mostra o processo dono do socket;
-i: mostra estatísticas do TCP sobre o socket;
-K: força o fechamento de um socket;
-s: mostra as estatísticas da rede;
-t: filtra somente os pacotes TCP;
-u: filtra somente os pacotes UDP;
-4: filtra somente os pacotes IPv4;
-6: filtra somente os pacotes IPv6;

Algumas opções podem ser combinadas para formar um determinado resultado.

Exemplos:

Para ver as estatísticas da rede:

60 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

$ ss -s
Total: 1020
TCP: 25 (estab 2, closed 1, orphaned 0, timewait 1)
Transport Total IP IPv6
RAW 1 0 1
UDP 9 6 3
TCP 24 22 2
INET 34 28 6
FRAG 0 0 0

Para ver as portas TCP abertas (em LISTENING):

$ ss -lt
State Recv-Q Send-Q Local Address:Port Peer
Address:Port
LISTEN 0 128 127.0.0.53%lo:domain 0.0.0.0:*
LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:*
LISTEN 0 128 [::]:ssh [::]:*

Para mostrar as portas TCP e UDP abertas e os processos donos do sockets. Para mostrar os
processos, o usuário precisa ser o administrador root:

# ss -ltpu
Netid State Local Address
udp UNCONN 127.0.0.1:323 users:(("chronyd",pid=20898,fd=5))
tcp LISTEN 0.0.0.0:ssh users:(("sshd",pid=9857,fd=3))

Mostra todas as conexões estabelecidas na porta (22) do ssh:

$ ss -o state established '( dport = :ssh or sport = :ssh )'


Netid Recv-Q Send-Q Local Address:Port Peer Address:Port

tcp 0 0 10.211.55.63:ssh 10.211.55.2:64749


timer:(keepalive,104min,0)

Esse comando é útil para diagnosticar os seguintes problemas:

Verificar quais serviços de rede que estão em execução (-l)


Verificar a quantidade de memória consumida por um socket (-m)
Verificar os processos donos dos sockets (-p)
Verificar as conexões estabelecidas (-o state established)

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 61


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Verificar o volume de dados trafegado em uma conexão TCP (-i)

host
$ host [ opções ] endereço

O comando host é utilizado para fazer buscar no serviço de resolução de nomes DNS.

Veja no exemplo que ele diz quais são os registros encontrados para o endereço
www.certificacaolinux.com.br:

$ host www.certificacaolinux.com.br
www.certificacaolinux.com.br is an alias for
myload-1433566614.us-east-1.elb.amazonaws.com.
myload-1433566614.us-east-1.elb.amazonaws.com has address
23.23.152.168
myload-1433566614.us-east-1.elb.amazonaws.com has address
23.21.124.198

O comando ping também é capaz de resolver nomes e testar a conectividade entre o host e o
endeço solicitado.

Se um endereço não existir, o host retornará um erro:

$ host esteendereconaoexiste.com
Host esteendereconaoexiste.com not found: 3(NXDOMAIN)

Também é possível fazer uma consulta a um determinado servidor de DNS, bastando


informar o endereço IP do servidor de DNS alvo:

$ host google.com 1.1.1.1


Using domain server:
Name: 1.1.1.1
Address: 1.1.1.1#53
Aliases:
google.com has address 172.217.162.110
google.com has IPv6 address 2800:3f0:4001:815::200e

Se o comando host demorar muito para responder e retornar o seguinte erro, é porque o
endereço IP do servidor de DNS especificado em /etc/resolv.conf não está acessível:

$ host google.com
62 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

;; connection timed out; no servers could be reached

dig
$ dig endereço

O comando dig (domain information groper) é uma poderosa e flexível ferramenta para
busca de informações em servidores de resolução de nomes. Ela é usualmente utilizada para
diagnosticar problemas de configuração de servidores.

O endereço recebido como argumento pode ser um IP ou um nome de máquina.

Neste exemplo, o dig retorna o endereço IP correspondente ao site certificacaolinux.com.br,


bem como qual servidor de DNS foi responsável (autoridade) para responder a consulta:

$ dig certificacaolinux.com.br
;; QUESTION SECTION:
;certificacaolinux.com.br. IN A
;; ANSWER SECTION:
certificacaolinux.com.br. 86400 IN A 192.168.1.5
;; AUTHORITY SECTION:
certificacaolinux.com.br. 86400 IN NS ns2.host.br.
certificacaolinux.com.br. 86400 IN NS ns.host.br.

O comando dig também pode ser utilizado para fazer perguntas por registros específicos no
servidor de nomes. No exemplo abaixo ele irá retornar apenas os registros do tipo MX do
domínio certificacaolinux.com.br:

$ dig MX certificacaolinux.com.br
;; QUESTION SECTION:
;certificacaolinux.com.br. IN MX
;; ANSWER SECTION:
certificacaolinux.com.br. 35 IN MX 3 alt2.aspmx.l.google.com.
certificacaolinux.com.br. 35 IN MX 10
web.certificacaolinux.com.br.
certificacaolinux.com.br. 35 IN MX 1 aspmx.l.google.com.
certificacaolinux.com.br. 35 IN MX 2 alt1.aspmx.l.google.com.

Qualquer tipo de consulta de DNS pode ser realizada, bastando especificar a chave. Neste
exemplo, mostra os endereços IPs com registro "A" que respondem por
www.certificacaolinux.com.br:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 63


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

$ dig A www.certificacaolinux.com.br
;; QUESTION SECTION:
;www.certificacaolinux.com.br. IN A
;; ANSWER SECTION:
www.certificacaolinux.com.br. 29 IN A 104.27.134.91
www.certificacaolinux.com.br. 29 IN A 104.27.135.91

nslookup
$ nslookup [opções] nome servidor_dns

Existe também uma ferramenta legada do pacote BIND-UTILS para diagnóstico dos
servidores de DNS chamada nslookup. Seu funcionamento é parecido com o comando dig e
muito útil para fazer perguntas para um servidor de DNS. Seu funcionamento clássico está
mais para diagnosticar um servidor de DNS do que problemas de resolução de nomes de
uma máquina qualquer.

Essa ferramenta abre um prompt próprio, que pode receber comandos que executam
consultas num servidor DNS.

Se nenhum servidor de DNS for especificado, o nslookup irá utilizar o servidor de DNS
especificado em /etc/resolv.conf:

Exemplo:

$ nslookup
Default Server: ns.certificacaolinux.com.br
Address: 200.216.215.5
> www.novaterra.com.br
www.novaterra.com.br
Server: 172.16.0.23
Address: 172.16.0.23#53
Non-authoritative answer:
www.novaterra.com.br.certificacaolinux.com.br canonical
name = myload-1433566614.us-east-1.elb.amazonaws.com.
Name: myload-1433566614.us-east-1.elb.amazonaws.com
Address: 23.21.124.198
Name: myload-1433566614.us-east-1.elb.amazonaws.com
Address: 23.23.152.168

Se um parâmetro for informado, ela não abrirá o prompt, e responde a solicitação:

$ nslookup certificacaolinux.com.br
64 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

Server: 172.30.0.2
Address: 172.30.0.2#53
Non-authoritative answer:
Name: certificacaolinux.com.br
Address: 104.27.134.91
Name: certificacaolinux.com.br
Address: 104.27.135.91
Name: certificacaolinux.com.br
Address: 2606:4700:30::681b:875b
Name: certificacaolinux.com.br
Address: 2606:4700:30::681b:865b

Um servidor de DNS também pode ser especificado como parâmetro:

$ nslookup certificacaolinux.com.br 8.8.8.8


Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
Name: certificacaolinux.com.br
Address: 104.27.134.91
Name: certificacaolinux.com.br
Address: 104.27.135.91
Name: certificacaolinux.com.br
Address: 2606:4700:30::681b:865b
Name: certificacaolinux.com.br
Address: 2606:4700:30::681b:875b

Um registro específico de DNS também pode ser consultado, com a opção "-q=registro":

$ nslookup -q=MX gmail.com 8.8.8.8


Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
gmail.com mail exchanger = 5 gmail-smtp-in.l.google.com.
gmail.com mail exchanger = 10 alt1.gmail-smtp-
in.l.google.com.
gmail.com mail exchanger = 30 alt3.gmail-smtp-
in.l.google.com.
gmail.com mail exchanger = 40 alt4.gmail-smtp-
in.l.google.com.
gmail.com mail exchanger = 20 alt2.gmail-smtp-
in.l.google.com.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 65


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

ethtool
$ ethtool [opções] dispositivo

O comando ethtool é uma ferramenta de configuração de placas de interface de rede.

O Ethtool permite que consultar e alterar as configurações de placa de rede, como


velocidade, porta, auto-negociação e muitos outros parâmetros.

Antes de utilizar o ethtool, é necessário obter uma lista das interfaces de rede com o
comando ip:

$ ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state
UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc
pfifo_fast state UP group default qlen 1000
link/ether 0a:3c:f2:7f:21:e0 brd ff:ff:ff:ff:ff:ff
inet 172.30.0.46/24 brd 172.30.0.255 scope global dynamic
eth0
valid_lft 3529sec preferred_lft 3529sec
inet6 fe80::83c:f2ff:fe7f:21e0/64 scope link
valid_lft forever preferred_lft forever

Para ver as características de uma determinada placa de rede, pode-se usar a opção "-k":

$ ethtool -k eth0
Features for eth0:
rx-checksumming: on [fixed]
tx-checksumming: on
tx-checksum-ipv4: on [fixed]
tx-checksum-ip-generic: off [fixed]
tx-checksum-ipv6: on
tx-checksum-fcoe-crc: off [fixed]
tx-checksum-sctp: off [fixed]
tx-scatter-gather: on
tx-scatter-gather-fraglist: off [fixed]
tx-tcp-segmentation: on
66 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

tx-tcp-ecn-segmentation: off [fixed]


tx-tcp-mangleid-segmentation: off
tx-tcp6-segmentation: on

Para ver as estatísticas da placa de rede, utiliza-se a opção "-S":

$ ethtool -S eth0
NIC statistics:
rx_gso_checksum_fixup: 0

Para alterar a configuração de uma placa de rede:

# ethtool --change eth0 speed 100 duplex full autoneg

Para piscar as luzes da placa de rede (útil para identificar máquinas com mais de uma placa
de rede):

# ethtool --identify eth0 20

Sintonia Fina na Rede

É possível fazer vários ajustes de "sintonia fina" na rede, através de parâmetros do Kernel.

Esses parâmetros podem ser alterados diretamente no pseudo-filesystem do diretório


/proc/net, alterando os valores de alguns arquivos:

$ ls /proc/net
anycast6 arp_tables_targets dev_snmp6 icmp6
ip6_flowlabel ip6_tables_names ip_tables_matches
mcfilter netstat ptype rt6_stats snmp6 stat udp6
wireless
arp connector fib_trie if_inet6
ip6_mr_cache ip6_tables_targets ip_tables_names
mcfilter6 packet raw rt_acct sockstat tcp
udplite xfrm_stat
arp_tables_matches dev fib_triestat igmp
ip6_mr_vif ip_mr_cache ip_tables_targets
netfilter protocols raw6 rt_cache sockstat6 tcp6
udplite6

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 67


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

arp_tables_names dev_mcast icmp igmp6


ip6_tables_matches ip_mr_vif ipv6_route
netlink psched route snmp softnet_stat udp unix

No entanto, a maneira usual e correta é alterar o arquivo de configuração de parâmetros do


sistema em /etc/sysctl.conf ou no diretório /etc/sysctl.d:

$ ls /etc/sysctl.d/
10-console-messages.conf 10-kernel-hardening.conf 10-magic-
sysrq.conf 10-ptrace.conf 99-sysctl.conf
README.sysctl
10-ipv6-privacy.conf 10-link-restrictions.conf 10-network-
security.conf 10-zeropage.conf protect-links.conf

Os parâmetros de rede vão sempre seguir a chave "net.algumparâmetro", como no arquivo


10-network-security.conf:

# cat 10-network-security.conf
net.ipv4.conf.default.rp_filter=2
net.ipv4.conf.all.rp_filter=2

Por exemplo, para ignorar todos os pacotes ICMP ECHO e ECHO-REPLY, de forma que o
computador não responda mais ao PING, pode-se alterar o arquivo no /proc:

# echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all

E para que esta configuração seja permanente, pode-se incluir a seguinte linha no arquivo
/etc/sysctl.conf:

net.ipv4.icmp_echo_ignore_all=1

E depois executar o comando sysctl -p para que as configurações do sysctl.conf sejam


aplicadas:

# sysctl -p

Observe que há uma relação direta do caminho do arquivo


/proc/net/ipv4/icmp_echo_ignore_all com o parâmetro net.ipv4.icmp_echo_ignore_all,
trocando-se a barra "/" por ponto ".".

Para o exame não é necessário saber alterar os valores, mas é importante saber a função do
arquivo sysctl.conf.
68 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

Ligação

Há três maneiras distintas que o Linux pode tratar as interfaces de rede, formando ligações
em rede com propósitos distintos:

Balanceamento de Carga

Neste tipo de ligação, o Linux pode balancear o tráfego de rede entre duas ou mais
interfaces.

Agregação

Neste tipo de ligação duas ou mais interfaces são combinadas para criar uma só interface,
combinando a capacidade de transmitir e receber pacotes das interfaces.

Ativa/Passiva

Neste tipo de ligação, uma interface é ativa, e a outra passiva, atuando como um "backup"
em caso de falha da primeira interface.

Desta forma, são possíveis sete modos de balanceamento de carga nas interfaces de rede:

Modo Nome Descrição

0 balance-rr Provê balanceamento de carga e tolerância a falhas com escalonamento round-robin

1 active-backup Provê tolerância a falhas usando uma interface como primária e outra como backup

2 balance-xor Provê balanceamento de carga e tolerância a falhas, transmitindo em uma interface


e recebendo pacotes em outra

3 broadcast Transmite todos os pacotes em ambas interfaces

4 802.3ad Agrega as interfaces para criar uma única conexão combinando a largura de banda

5 balance-tlb Provê balanceamento de carga e tolerância a falhas, baseado na carga de


transmissão de cada interface

6 balance-alb Provê balanceamento de carga e tolerância a falhas, baseado na carga de


recebimento de cada interface

Para inicializar o modo de ligação das interfaces de rede, primeiro é necessário carregar o
módulo bonding no Kernel:

# modprobe bonding

Assim que este módulo é carregado, ele cria uma interface "bind0", que pode ter seu modo
de operação configurado:

# ip link add bond0 type bond mode 4

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 69


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Uma vez definido o modo de operação da ligação, é possível adicionar as interfaces que irão
trabalhar ser ligadas:

# ip link set eth0 master bond0


# ip link set eth1 master bond0

Desta forma, o Linux irá tratar a interface bond0 como uma única interface, fazendo uso do
balanceamento de carga ou tolerância a falhas, conforme o modo de operação escolhido.

Ponte

Se você tem mais uma interface de rede, ligando redes distintas, é possível habilitar o Linux
para atuar como uma ponte entre as duas redes.

Este tipo de configuração é comum em firewall, onde uma interface liga a rede local, e a
outra interface liga no modem ou roteador.

Para habilitar o encaminhamento de pacotes de uma rede para outra, é preciso alterar o
parâmentro ip_forward do kernel, adicionando a seguinte linha no /etc/sysctl.conf:

net.ipv4.ip_forward = 1

E depois para aplicar a configuração:

# sysctl -p

Também é possível alterar diretamente no Kernel, alterando o valor do arquivo ip_forward no


/proc:

# echo 1 > /proc/sys/net/ipv4/ip_forward

O comando brctl pode usado para configurar, manter e inspecionar a configuração da ponte
rede no kernel Linux.

70 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Simulado
1.4 Gerenciar Armazenamento no Linux

O Linux suporta diversos tipos de armazenamento de dados em massa. Estes dispositivos


podem ser categorizados em óticos, magnéticos ou em memória.

Os discos óticos são os CD-ROMs (700Mb), DVDs (4,7-8,5 Gb) e Blu-Rays (2550Gb). Não são
rápidos como os HDs, mas têm grande durabilidade se acondicionados em locais apropriados
e não permitem gravar os dados diversas vezes.

Os discos magnéticos têm grande capacidade de armazenamento de dados, que pode chegar
a 8 Terabytes. Alguns modelos são híbridos, pois possuem discos magnéticos e grandes
memórias flash para armazenar os dados mais lidos ou até mesmo o sistema operacional.
São sensíveis a solavancos e quedas.

Ainda na categoria de dispositivos magnéticos, temos as fitas magnéticas, bastante


utilizadas para backup de dados. Permitem gravar dados de forma sequencial com baixo
custo. Seu uso é cada vez menor devido ao baixo preço dos discos, computação em cloud e
outras estratégias de cópia de segurança mais avançadas.

Os “discos” em memória são na realidade bancos de memória flash chamados de Solid State
Drive (SSD) – drive de estado sólido – encapsulados em uma caixa do tamanho de um HD e
não possuem partes móveis como os discos óticos e magnéticos. Seu tempo de acesso aos
dados é incrivelmente veloz se comparado aos discos magnéticos e óticos, são resistentes a
quedas e solavancos, consomem menos energia, dentre outros benefícios. No entanto a
capacidade de armazenamento não ultrapassa 1 Terabyte, e seu custo é elevado em
comparação com os discos magnéticos. São muito utilizados em Ultrabooks e em servidores
de alta-performance.

Layout do Disco

Projetar de forma eficiente o particionamento dos discos é fundamental para uma instalação
bem feita.

O Linux é um sistema robusto que possibilita que o sistema de arquivos seja dividido em
múltiplas partições e múltiplos discos. Este esquema pode ser um pouco confuso para
usuários acostumados ao Microsoft Windows, mas é essencial para o exame CompTIA Linux.

A escolha de como o sistema de arquivos será organizado pode ser influenciada por diversos
fatores como a quantidade de espaço em disco, tamanho do sistema, aplicações utilizadas e
como os backups serão efetuados.

Independente destas variáveis, algumas considerações importantes precisam ser feitas e


levadas em conta durante o particionamento dos discos na instalação.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 71


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

O primeiro ponto que precisa ser abordado é a localização do gerenciador de boot no disco. A
maioria das BIOS antigas tem a limitação de não conseguir ler setores do disco depois do
cilindro 1024. Desta forma, o gerenciador de boot GRUB precisa estar localizado dentro dos
primeiros 1024 cilindros para que seja capaz de carregar o Kernel corretamente. Os novos
firmwares das placas-mãe EFI e UEFI já não têm esta limitação de conseguir ler
adequadamente somente os primeiros 1024 cilindros.

Na maioria dos casos é recomendado que o gerenciador de boot esteja separado do sistema
de arquivos principal e montado como /boot. Isto deve ser feito se alguma destas condições
for verdadeira:

Se o disco tiver mais de 1024 cilindros. Assegura que o gerenciador e o Kernel


possam ser lidos pela BIOS;
Se o sistema de arquivos raiz for formatado com outro sistema de arquivos que não
seja ext2, ext3 ou ext4. Algumas distribuições não suportam jornaling para a partição
de boot, como o reiserfs e outros.
Já nas placas mãe com EFI, este firmware já não utiliza o mesmo esquema de
endereçamento de Cilindro, Cabeça e Setor (CHS) para detectar a geometria de um
disco, preferindo o Logical Block Addressing (LBA). Com isso, esta limitação de 1024
cilindros não existe. Nas placas mãe que usam BIOS e que fornecem o recurso de
LBA, este limite também não precisa ser observado.

Tanto na BIOS como no EFI, é altamente recomendável separar a partição que hospedará o
sistema de carga do kernel (GRUB ou GRUB2), bem como a imagem do kernel do restante
do disco em uma partição chamada “/boot” e formata-la com um sistema de arquivos
simples como ext2 ou ext3. Isso permite que as placas que usam EFI possam acessar
diretamente essa partição e o GRUB.

Você pode se perguntar por que o layout do disco é importante se o sistema de arquivos é
apenas uma grande árvore. Bem, o que realmente acontece é que cada dispositivo de bloco,
como uma partição do disco rígido, CD-ROM ou pendrive, na verdade possui um sistema de
arquivos.

Você cria a visualização em árvore única do sistema de arquivos montando os sistemas de


arquivos em diferentes dispositivos em um ponto da árvore chamado ponto de montagem.

Normalmente, o kernel inicia esse processo de montagem montando o sistema de arquivos


em alguma partição do disco rígido como raiz "/".

Você pode montar outras partições do disco rígido como /boot, /tmp ou /home. Você pode
montar o sistema de arquivos em uma unidade externa como /mnt/pendrive e o sistema de
arquivos em um CD-ROM como /media/cdrom1, por exemplo.

Você também pode montar arquivos de outros sistemas usando um sistema de arquivos em
rede, como o NFS. Existem outros tipos de montagens de arquivo, mas isso dá uma ideia do
processo.

Enquanto o processo de montagem realmente monta o sistema de arquivos de algum


dispositivo, é comum dizer simplesmente que você "monta o dispositivo", que se entende por

72 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

"montar o sistema de arquivos no dispositivo".

Suponha que você acabou de montar o sistema de arquivos raiz (/) e deseja montar um CD-
ROM, /dev/sr0, no ponto de montagem /media/cdrom.

O ponto de montagem deve existir antes de montar o CD-ROM sobre ele. Quando você monta
o CD-ROM, os arquivos e subdiretórios no CD-ROM se tornam os arquivos e subdiretórios de
/media/cdrom.

Os arquivos ou subdiretórios que já estavam em /media/cdrom não são mais visíveis, embora
ainda existam no dispositivo de bloco que continha o ponto de montagem /media/cdrom. Se
o CD-ROM estiver desmontado, os arquivos e subdiretórios originais ficarão visíveis
novamente.

Você deve evitar esse problema não colocando outros arquivos em um diretório destinado ao
uso como ponto de montagem como o /media ou /mnt.

A tabela a seguir mostra os diretórios necessários no / pelo padrão de hierarquia do sistema


de arquivos, bem como recomendações de particionamento:

Diretório Utilidade da Pasta Sugestão

bin Programas essenciais de uso comum Pode-se manter no raiz /

boot Arquivos do gerenciador de boot, Pode-se manter no raiz / ou deve-se criar uma partição
imagem do kernel e initramfs separada dependendo da placa mãe e/ou do sistema
de arquivos do raiz diferente de ext2/ext3/ext4.

dev Arquivos de Dispositivos Pode-se manter no raiz /

etc Arquivos de Configuração do Sistema Pode-se manter no raiz /

lib Bibliotecas compartilhadas e módulos Pode-se manter no raiz /


do Kernel

media Ponto de montagem para mídia Pode-se manter no raiz /


removível

mnt Ponto de montagem temporário Pode-se manter no raiz /

opt Diretório para instalação de software Pode-se manter no raiz / ou criar uma partição
de terceiros separada, em caso de servidores, de forma a manter o
sistema de terceiros separado

sbin Programas essenciais de usso do Pode-se manter no raiz /


administrador root

srv Diretórios de dados de serviços Pode-se manter no raiz / ou criar uma partição
providos pelo Linux, como por separada, em caso de servidores para não travar o
exemplo servidor web sistema em caso de disco cheio

tmp Arquivos temporários dos programas e Pode-se manter no raiz / ou criar uma partição
aplicativos separada, em caso de servidores para não travar o
sistema em caso de disco cheio

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 73


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Diretório Utilidade da Pasta Sugestão

usr Diversos arquivos Pode-se manter no raiz / ou usar um disco em rede


para compartilhar o mesmo diretório com várias
máquinas

var Dados variáveis - Spool de impressão, Recomenda-se uma partição separada, de forma que os
Logs, e-mails, etc. LOGs, Spool de impressão ou e-mails não travem o
sistema por disco cheio

home Diretório HOME dos usuários Para computadores pessoais pode-se manter no raiz /.
Já para servidores recomenda-se partição separada,
para não travar o sistema em caso de disco cheio

Partições

As partições como o próprio nome diz, são divisões que podem ser feitas num disco para
dividir tamanho de alguma maneira que convenha para sua utilização. De forma bem
grosseira, é como dividir um bolo em fatias.

O Linux nomeia um disco e suas partições de maneira diferente dependendo do tipo de disco.

Antigamente, o Linux nomeava a primeira unidade de um disco SCSI como /dev/sda e a


primeira unidade de um disco rígido IDE como /dev/hda.

Com o advento das unidades IDE conectadas em série (SATA), o primeiro disco conectado
numa unidade SATA, passou a ser chamado de /dev/sda e um disco conectado em uma
unidade paralela PATA como /dev/hda.

Em sistemas mais recentes, todas as unidades IDE são nomeadas /dev/sda, /dev/sdb,
/dev/sdc, e assim por diante. Independente se estão em SATA/PATA ou se são de disco rígido
ou memória não volátil (SSD).

A mudança de nome para unidades IDE é resultado do sistema de hotplug, que inicialmente
somente suportava unidades USB. O hotplug permite conectar novos dispositivos e usá-los
imediatamente e agora é usado para todos os dispositivos, estejam eles integrados ao
sistema ou posteriormente conectados a um sistema em execução usando USB ou Firewire
(IEEE 1394) ou potencialmente outros tipos de conexão.

As partições de um disco são nomeadas com números inteiros que iniciam em 1. Então a
primeira partição de um primeiro disco disco será chamada de /dev/sda1.

Existem basicamente duas maneiras de particionar um disco: o sistema legado criado nos
anos 80 pela IBM, chamado de Master Boot Record (MBR), que tem várias limitações, e o
atualmente utilizado GUID Partition Table (GPT).

Master Boot Record - MBR

Antes de abordar as partições MBR, é necessário fazer uma introdução a geometria de um

74 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

disco. Lembre-se que tradicionalmente os discos rígidos eram realmente discos magnéticos,
e que eram lidos por uma cabeça de leitura, como os antigos toca-discos.

Desta forma, tradicionalmente, um disco rígido era formatado em setores com uma
quantidade predeterminada de bytes em cada setor. Nos primórdios os setores tinham 512
bytes.

Assim, os setores eram alinhados numa faixa do disco que podia ser lida sem mover a
cabeça de leitura, girando apenas os discos.

Como havia uma limitação na quantidade de magnetos do disco, os HD's geralmente tinham
mais de um prato. A coleção de faixas nos vários pratos que podiam ser lidas sem mover a
cabeça é chamada de cilindro.

Desta forma, a geometria de um disco rígido é expressa em quantidade de cilindros,


quantidade de cabeças de leitura e quantidade de setores e tamanho dos setores em bytes.

E havia um setor especial de 512 bytes no início do disco chamado Master Boot Record, que
armazenava a estrutura organizacional do disco, com informações sobre as partições, bem
como um apontador para qual setor do disco continha o gerenciador de boot.

Dado a limitação do setor ter somente 512 bytes, o Master Boot Record era limitado a
permitir somente quatro partições primárias, ou três primárias e uma extendida, que
permitia mais 63 partições lógicas.

Os arquivos então eram dispostos nos outros setores do disco e o sistema de arquivos
mantinha uma ou mais tabelas de arquivos, que indicavam em qual cabeça, trilha e setor o
arquivo começava.

O tamanho do MBR também forçava a um limite de capacidade dos discos em 2 TiB (2^32 x
512 bytes).

Logicamente, com o passar do tempo, houve limitações nos tamanhos possíveis para
cilindros, cabeçotes e setores usados nos discos, e a indústria resolveu converter os valores
geométrios de um disco que a BIOS do computador podia entender para um endereçamento
lógico dos blocos LBA (Logic Block Addressing). Isso permitiu o uso de discos com maior
capacidade.

Mesmo assim, o MBR continuava com uma limitação de número de partições possíveis.

Para atualizar a estrutura organizacional do disco, um novo formato foi criado e nomeado de
GUID Partition Table (GPT), que suportam até 128 partições por padrão.

Você pode usar os comandos fdisk ou parted para exibir informações da partição em discos
MBR. Ambos os comandos podem operar interativamente ou você pode passar parâmetros
na linha de comando.

Você pode usar o parâmetro -l para exibir informações sobre a versão do programa. Ambos
suportam várias unidades diferentes para exibir e alocar partições.

Abaixo um disco com MBR (DOS) com duas partições:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 75


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

# fdisk -l /dev/sda
Disco /dev/sda: 68.7 GiB, 68719476736 bytes, 134217728 setores
Unidades = setor de 1 * 512 = 512 bytes
Tamanho de setor (lógico/físico): 512 bytes / 4096 bytes
Tamanho E/S (mínimo/ótimo): 4096 bytes / 4096 bytes
Tipo de rótulo do disco: dos
Identificador do disco: 0x0009f16e

Dispositivo Início Fim Setores Tamanho Tipo


/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 134217727 66059264 8e Linux LVM

Veja agora um disco com uma partição com GPT:

# fdisk -l /dev/sda
Disco /dev/sda: 8 GiB, 8589934592 bytes, 16777216 setores
Unidades: setor de 1 * 512 = 512 bytes
Tamanho de setor (lógico/físico): 512 bytes / 512 bytes
Tamanho E/S (mínimo/ótimo): 512 bytes / 512 bytes
Tipo de rótulo do disco: gpt
Identificador do disco: 9B950845-EC1C-437D-8C99-7E0207F60000

Dispositivo Início Fim Setores Tamanho Tipo


/dev/sda1 4096 16777182 16773087 8G Linux sistema de
arquivos

O mesmo disco pode ser visualizado usando o comando parted:

# parted -l /dev/sda
Model: Xen Virtual Block Device (xvd)
Disk /dev/xvda: 8590MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name


Sinalizador
1 2097kB 8590MB 8588MB xfs Linux

Model: Xen Virtual Block Device (xvd)


Disk /dev/xvdf: 21,5GB
Sector size (logical/physical): 512B/512B

76 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

GUID Partition Table (GPT)

Tabela de Partição GUID (do inglês GUID Partition Table - GPT) é um padrão para o layout da
tabela de partições em um dispositivo de armazenamento físico usado em um PC desktop ou
servidor, como uma unidade de disco rígido ou uma unidade de estado sólido, usando
identificadores globalmente únicos (globally unique identifiers - GUID).

Embora o GPT seja parte do padrão do Extensible Firmware Interface (EFI) proposto pela Intel
em substituição ao BIOS da IBM, ela também é utilizada em alguns sistemas legados com
BIOS devido às limitações das tabelas de partição do MBR.

Todos os sistemas operacionais modernos suportam nativamente GPT, incluindo o Linux,


macOS e Microsoft Windows a partir do Windows 7.

O GPT trouxe algumas possibilidades:

Suporte até 128 partições primárias;


Tamanho de disco de 8 ZB (zettabytes);
A tabela de partições do GPT é gravados no início e no final do disco para
redundância. A redundância extra permite mais resiliência contra a erros de disco;
Contém soma de verificação CRC32 para melhorar a integridade da estrutura de
dados de partição.

É possível converter um disco que use MBR em GPT, mas isso foge do escopo do exame.

No momento de criar uma partição do disco, é possível escolher o tipo de sistema de


partições desejado, entre o MBR e GPT.

Partições e Sistemas de Arquivos no


Linux

O sistema de arquivos do Linux é tã o robusto e flexı́vel que possibilita ao usuá rio criar e
manter arquivos em diferentes partições, diferentes discos, diferentes dispositivos e até em
computadores remotos.

E neste contexto que o Linux tem suporte a inú meros dispositivos como discos IDE, SCSI,
SSD, CD-ROM, CD-RW, Pen-Drivers, Zip-Drivers, Jaz-Drivers, Memó rias Flash, dentre outros.

Cada um destes dispositivos podem ser formatados para o sistema de arquivos EXT2, padrã o
do Linux, ou outros formatos, como: ReiserFS, FAT, FAT32, NTFS, EXT3, EXT4, BTRFS, XFS
etc. Poucos sistemas operacionais oferecem esta liberdade. Cada distribuição pode adotar
um sistema de arquivos diferente como padrã o.

Antes de falarmos dos dispositivos é preciso fazer uma pequena introdução nos tipos de

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 77


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

discos mais comuns no mercado: Os padrõ es IDE (PATA ou SATA) e SCSI.

Os discos IDE (Integrated Device Eletronics) sã o os mais utilizados pelos usuá rios caseiros e
oferecem uma relativa performance a baixo custo. As placas mã e comuns possuem duas
interfaces IDE chamadas de primá ria e secundá ria. E cada interface possibilita a conexã o
com dois discos. Dependendo de qual interface o disco está conectado, ele vai ser
configurado como mestre primá rio, escravo primá rio, mestre secundá rio e escravo
secundá rio.

O padrã o SATA é o adotado nos dias atuais, pois esta tecnologia fornece melhores
velocidades, cabos menores e, consequentemente, conectores menores, que ocupam menos
espaço, simplificando a vida de usuá rios e fabricantes de hardware.

Os discos SCSI (Small Computer System Interface) geralmente oferecem um desempenho


melhor que os discos IDE. Geralmente sã o mais caros e utilizados em servidores. Para utilizar
um disco SCSI é necessá ria uma placa SCSI que oferece suporte à pelo menos 15 discos.

Estes conceitos sã o importantes para podermos entender a nomenclatura que os discos tê m
no sistema de arquivos do Linux.

Por padrã o, os discos eram nomeados da seguinte forma no Linux:

Nome Ló gico do Dispositivo Dispositivo Fı́sico (disco)

/dev/hda Disco IDE conectado na interface primá ria mestre

/dev/hdb Disco IDE conectado na interface primá ria escravo

/dev/hdc Disco IDE conectado na interface secundá ria mestre

/dev/hdd Disco IDE conectado na interface secundá ria escravo

/dev/sda Disco SCSI ou SATA conectado no primeiro canal

/dev/sdb Disco SCSI ou SATA conectado no segundo canal

/dev/sdc Disco SCSI ou SATA conectado no terceiro canal

Mas nas distribuições atuais, devido a evolução das interfaces IDE, e o sistema de Hotplug
que permitiu que os dispositivos sejam usados de forma imediata, todos os dispositivos de
disco "permanentes" foram nomeados para /dev/sd*.

No Linux, o sistema UDEV controla como os discos serão nomeados. Ele é responsável por
detectar o hardware conectado ao Linux e designar um nome através de um descritor de
arquivos no diretório virtual /dev.

No caso de dispositivos de armazenamento, o scritpt /lib/udev/rules.d/60-persistent-


storage.rules define as regras de como cada distribuição vai enxergar e nomear os discos.
No entanto, este nome do disco em /dev/ pode mudar, dependendo de como o disco é
conectado ao computador. Por exemplo, um disco denominado /dev/sdb pode ser alterado
para /dev/sdc se mudar a forma ou ordem de conexão.

78 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Então, é possível que um disco mude de nome no diretório /dev depois que alguma mudança
no hardware é feita.

Para contornar isso, o sistema UDEV também cria links no diretório /dev/disk com atributos
únicos do disco, que apontam para o nome do disco em /dev/.

Desta forma, o UDEV pode criar alguns diretórios com links simbólicos:

/dev/disk/by-id contém links com dados de fabricante, modelo e número serial;


/dev/disk/by-label contém links com um nome designado do dispositivo;
/dev/disk/by-path contém links com a porta física do hardware ao qual o disco está
conectado;
/dev/disk/by-uuid contém links com o identificador único de 128 bits designado
para o dispositivo;

Nem todos os diretórios podem estar presentes em /dev/disk, dependendo da distribuição.

Veja o exemplo:

$ find /dev/disk/
/dev/disk/
/dev/disk/by-label
/dev/disk/by-label/Ubuntu\x2019.10\x20amd64
/dev/disk/by-label/CDROM
/dev/disk/by-partuuid
/dev/disk/by-partuuid/9577ccb7-01
/dev/disk/by-uuid
/dev/disk/by-uuid/2019-10-17-12-53-34-00
/dev/disk/by-uuid/2019-11-10-11-06-48-00
/dev/disk/by-uuid/810efa9e-d4ce-4f8e-afd7-dc488366fda8
/dev/disk/by-id
/dev/disk/by-id/ata-Ubuntu_Linux-0_SSD_YV2K6W55F8R4V2P6H7XB-part1
/dev/disk/by-id/ata-Ubuntu_Linux-0_SSD_YV2K6W55F8R4V2P6H7XB
/dev/disk/by-id/ata-Virtual_DVD-ROM__1__-_31415B265
/dev/disk/by-id/ata-Virtual_DVD-ROM__2__-_31415C265
/dev/disk/by-path
/dev/disk/by-path/pci-0000:00:1f.2-ata-1-part1
/dev/disk/by-path/pci-0000:00:1f.2-ata-1
/dev/disk/by-path/pci-0000:00:1f.2-ata-2
/dev/disk/by-path/pci-0000:00:1f.2-ata-3

Desta forma, é seguro designar discos no Linux utilizando a denominação UUID dele.

O utilitário blkid pode ser utilizado para mostrar a ligação entre o nome do disco em /dev/ e o
UUID:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 79


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

$ blkid
/dev/sda1: UUID="810efa9e-d4ce-4f8e-afd7-dc488366fda8"
TYPE="ext4" PARTUUID="9577ccb7-01"
/dev/sr0: UUID="2019-11-10-11-06-48-00" LABEL="CDROM"
TYPE="iso9660"
/dev/sr1: UUID="2019-10-17-12-53-34-00" LABEL="Ubuntu 19.10
amd64" TYPE="iso9660" PTUUID="6132549e" PTTYPE="dos"

No modelo antigo usado pelo MS-DOS para tabela de partições de disco, o Master Boot
Record - MBR, cada disco pode ter de uma a dezesseis partições. As partições funcionam
como um contê i ner para os sistemas de arquivos. No Windows cada partiçã o pode ser
representada por uma letra (ex.: C:).

Já no novo modelo de tabela de partições usados com advento dos Firmwares EFI e UEFI, a
Tabela de Partição GUID - GPT, permite que um disco seja particionado em até 128 partições.

No Linux cada partição é representada por um nú mero inteiro. Por exemplo, a primeira
partição de um disco conectado na interface primá ria vai ser nomeada como /dev/sda1. Se
neste disco existir uma segunda partição, o nome será /dev/sda2 e assim por diante.

Para visualizar as partições encontradas pelo Kernel, você pode ver o conteúdo do arquivo
/proc/partitions:

$ cat /proc/partitions
major minor #blocks name
8 0 67108864 sda
8 1 1048576 sda1
8 2 66059264 sda2
11 0 1048575 sr0
253 0 42975232 dm-0
253 1 2097152 dm-1
253 2 20979712 dm-2

Tipos de Partições
Existem trê s tipos de partições possı́veis:

Partições Primá rias

No sistema de tabela de partições do MBR, cada disco pode conter no má ximo quatro
partições primá rias. Estas partições contê m necessariamente um sistema de arquivos e pelo
menos uma deve ser criada.

As partiçõ e s primá rias podem ser nomeadas como: /dev/sda1, /dev/sda2, /dev/sda3 e
/dev/sda4. Pelo menos uma destas partições primá rias deve ser marcada como ativa para
que a carga do sistema operacional (boot) seja possı́vel.

80 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

O sistema GPT permite que até 128 partições sejam criadas. O GPT não usa o conceito de
partições primárias ou estendidas, apenas partições.

Partições Estendidas

Para driblar a limitação de apenas quatro partições primárias no sistema MBR, foi criado as
partições estendidas.

As partições estendidas sã o uma variação das partições primá rias, mas nã o podem conter
um sistema de arquivos. Elas funcionam como um contê iner para as partições ló gicas. Em
um disco com MBR somente podemos ter uma partição estendida e ela toma lugar de uma
partição primá ria.

Uma partiçã o estendida somente poderá ser utilizada com um sistema de arquivos se
contiver uma ou mais partições ló gicas. Em uma configuração padrã o, poderı́amos ter o
seguinte esquema de particionamento dos discos:

/dev/sda1 (partição primá ria)


/dev/sda2 (partição estendida)

Partições Logicas
́
As partições ló gicas existem em conjunto com uma partição estendida e podemos ter de uma
a quinze partições deste tipo no sistema MBR clássico. Elas sã o nomeadas a partir do nú mero
cinco até dezesseis. As partições ló gicas estã o contidas “dentro” de uma partição estendida.

/dev/sda1 (partição primá ria)


/dev/sda2 (partição estendida)
/dev/sda5 (partição ló gica)
(...)
/dev/sda16 (partição ló gica)

Podemos ter no má ximo 15 partições com sistema de arquivos em um ú nico disco, sendo 3
primá rias e doze ló gicas.

Tipo de Partição MBR GPT

Primárias Até 4 Permite até 128 partições. Não divide por tipo de
Nomeadas de sda1 até sda4 partição

Estendida Apenas 1
Nomeadas de sda1 até sda4

Lógica Até 12
Nomeadas de sda5 até sda16

Partição de Swap (arquivo de troca)

Existe ainda outro tipo especial de partição no Linux chamado de partição de swap. Esta

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 81


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

possibilita que o Linux tenha uma memó ria virtual em disco. Este tipo de memó ria é usado
como arquivo de troca de dados entre a memó ria fı́sica e o disco. Seu objetivo é aumentar o
desempenho do sistema. Esta partiç ã o precisa de uma designaçã o especial e uma
formatação especial també m. Geralmente a partição de swap tem pelo menos o tamanho da
memó ria RAM e, em sistemas com pouca memó ria, o dobro.

Uma vez definidos os tamanhos das partições é difı́cil aumentar ou diminuir sem a perda dos
dados, a menos que se use o LVM.

Sistemas de Arquivos

O Linux possui suporte para diversos tipos de sistemas de arquivos. Cada um tem
caracterı́s ticas relevantes e també m limitaçõ e s. Portanto, a escolha vai depender da
finalidade do sistema e do tipo de arquivo (tamanho, volume de dados, fragmentação etc.)
que será armazenado.

ext2
O Ext2 é uma evolução das limitações impostas pelo ext. O Ext2 (second extended file
system) é um sistema de arquivos para dispositivos de blocos (disco rı́gido, disquete, pen-
drive).

Foi projetado para o Linux por Ré my Card e Stephen Tweedie para corrigir as deficiê ncias do
Ext e prover um sistema que respeitasse a semâ ntica UNIX, de forma a agrupar os dados em
blocos de bytes.

Um bloco nada mais é do que um conjunto de setores do disco (cada setor tem 512 bytes).
Desta forma, um bloco de dados é a menor unidade de alocação para o Ext2 e seu tamanho
pode ser de 1.024, 2.048 ou 4.096 bytes definido durante o processo de formatação do disco.

O ext2 trouxe vantagens sobre o ext, como o tamanho má ximo da partição de 2TiB e o
tamanho má ximo dos arquivos de 2GB, dependendo do tamanho do bloco.

ext3
O Ext3 (third extended file system) é um sistema de arquivos que acrescenta o recurso de
journaling ao Ext2.

O journaling consiste em um registro (log ou journal) de transações cuja finalidade é


recuperar o sistema em caso de desligamento nã o programado, falhas de disco ou queda de
energia.

Há trê s nı́veis de journaling disponı́veis no Ext3:

Journal: Os metadados e os dados (conteú do) dos arquivos sã o escritos no journal
antes de serem de fato escritos no sistema de arquivos principal. Isso aumenta a
confiabilidade do sistema, mas significa uma perda de desempenho, devido à
necessidade de todos os dados serem escritos no disco duas vezes;

82 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Writeback: Os metadados sã o escritos no journal, mas nã o o conteú do dos arquivos.
Essa opção permite um melhor desempenho em relação ao modo journal, poré m
introduz o risco de escrita de dados com “lixo” aos arquivos em caso de queda de
energia;
Ordered: Somente os metadados sã o gravados no journal. Mas neste modo, o
conteú do dos arquivos deve ser gravado antes de gravar os metadados no Journal.
Desta forma um arquivo que foi alterado, mas que nã o teve seu metadado gravado
no journal, pode voltar ao conteú do original antes da perda de energia. Esse modo é
considerado um meio-termo aceitá vel entre confiabilidade e desempenho, sendo,
portanto, o nı́vel padrã o.

Embora o desempenho do ext3 seja menor que o de outros sistemas de arquivos (como
ReiserFS e XFS), ele permite que seja feita a atualização direta a partir de um sistema com
ext2, sem a necessidade de realizar um backup e restaurar posteriormente os dados.

A estrutura da partição ext3 é semelhante à da ext2, com a adição do recurso de journaling


atravé s do arquivo .journal que fica oculto pelo có digo ext3 na partição.

Assim como o ext2, o ext3 precisa ter o tamanho do bloco definido durante o processo de
formatação do disco.

O ext3 ampliou o suporte a grandes arquivos e discos, como o tamanho má ximo da partição
de 16TiB e o tamanho má ximo dos arquivos de 16GB, dependendo do tamanho do bloco.

ext4
O fourth extended filesystem é um sistema de arquivos també m de journaling que a partir do
kernel 2.6.28 ficou disponı́vel de forma está vel no sistema.

O ext4 trabalha com volumes de até 1 exbibyte e é totalmente compatı́vel com ext2 e ext3,
com performance melhor. Alé m disso ele possui menor fragmentação de arquivos e seu
checksum do Journaling é mais confiá vel. A checagem de disco é mais rá pida do que com o
e2fsck. Muitas distribuições o adotam como padrã o de sistema de arquivos.

XFS
O XFS é um sistema de arquivos inicialmente desenvolvido pela Silicon Graphics para o seu
sistema operacional IRIX. Posteriormente teve seu có digo fonte liberado e foi adaptado para
funcionar no Linux.

O XFS é um sistema de arquivos desenvolvido em 64 bits, compatı́vel com sistemas de 32


bits. Em plataformas de 64 bits, possui um limite de tamanho de 8 EiB para volume e para
cada arquivo. Em sistemas de 32 bits, o tamanho má ximo do volume ou de um arquivo é
limitado a 16 TiB.

O XFS oferece suporte a journaling com um desempenho melhor que o journaling do ext3. O
XFS també m oferece suporte nativo a RAID de discos, gerando um sistema de arquivos ú nico
em diversos discos.

Diferente do ext3, o XFS permite que o tamanho do bloco possa variar entre 512 bytes a 64

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 83


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

kilobytes. De forma que, se o sistema for comportar um grande nú mero de pequenos
arquivos, o XFS irá escolher um bloco pequeno de forma a maximizar espaço. Já se o uso for
de arquivos muito grandes, ele irá escolher blocos grandes para aumentar o desempenho.

O XFS foi projetado para resistir à alta fragmentação de arquivos de forma a aumentar o
desempenho. Ele possui també m uma ferramenta chamada xfs_fsr que faz a reorganização
do disco em partições montadas e ativas.

O XFS permite que o tamanho dos sistemas de arquivos possa ser redimensionado atravé s
da ferramenta xfs_growfs.

O XFS també m possui ferramentas para backup e recuperação dos dados chamadas xfsdump
e xfsrestore, que facilitam a salvaguarda dos dados.

Reiserfs v3
O ReiserFS foi um dos sistemas de arquivos mais usado em sistemas Linux. Depois da
chegada do XFS e do BTRFS, ele foi praticamente abandonado.

Entre suas principais caracterı́sticas, possui tamanho de blocos variá veis, suporte a arquivos
de até 1 EiB de tamanho, e o acesso à á rvore de diretó rios é um pouco mais rá pido que o
ext3.

O ReiserFS usa á rvores balanceadas para tornar o processo de busca de arquivos,


informações sobre segurança e outros metadados mais eficiente. Para arquivos muito
pequenos, seus dados podem ser armazenados pró ximos aos metadados; entã o, ambos
podem ser recuperados com um pequeno movimento do mecanismo da “cabeça” de leitura
do disco.

O ReiserFS usa alocação dinâ mica de inodes, já que esse sistema de arquivos nã o os aloca
em espaços fixos ou blocos e, sim, aloca o tamanho exato que o arquivo precisa.

No caso de um desligamento incorreto do sistema, o ReiserFS é capaz de recuperar a


consistê ncia do sistema de arquivos em pouco tempo e a possibilidade de perda de pastas ou
partições é reduzida.

Uma desvantagem do ReiserFS é o seu consumo de CPU muito elevado. Utiliza no mı́nimo 7
por cento da CPU, chegando a usar até 99 por cento, quando a atividade de disco é elevada.

VFAT
O VFAT (Virtual File Allocation Table) é uma extensã o para os sistemas de arquivos FAT16 e
FAT32 incluı́da a partir do Windows 95 com suporte no Linux.

Este sistema de arquivos é largamente usado em cartõ es de memó ria e pen-drivers.

Ele possui grandes limitações e nã o deve ser usado em sistemas de arquivos Linux, de forma
que seu uso deve ser restrito para leitura e gravação de dados em dispositivos de memó ria.

BTRFS
O B-Tree File System é um sistema de arquivos desenhado para ser escalá vel, confiá vel e de
84 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

fá cil gerenciamento. Ele possui desfragmentação on-line, possibilidade de aumentar e


diminuir o volume on-line, balanceamento de dados entre discos para distribuição de carga,
correçã o de erros on-line, compactaçã o de dados transparente, possibilidade de criar
snapshots (imagens dos discos on-line), conversã o a partir de sistemas ext3 e ext4, suporte a
RAID 0, RAID 1, RAID 5, RAID 6 e RAID 10, Data trim para discos SSD, dentre outras
funcionalidades.

Dentre as suas funcionalidades, podemos destacar:

Recuperação automática de dados;


Desfragmentação online;
Aumento e redução do volume online;
Adição e remoção de dispositivo de bloco online;
Balanceamento online (movimento de objetos entre dispositivos de bloco para
balanceamento de carga);
Suporte a RAID 0, RAID 1 e RAID 10;
Uso de Subvolumes;
Compressão de forma transparente via zlib, LZO e ZSTD, configurável por arquivo ou
volume;
Instantâneos (snapshots) de subvolumes somente leitura ou gravável atomicamente ;
Clonagem de arquivo;
Conversão de ext3/4 para Btrfs;
Descarte de blocos (recupera espaço em ambientes virtualizados e melhora o
nivelamento da escrita em SSDs com TRIM)
Backup incremental

Sem dú vida o BTRFS é um sistema de arquivos moderno, robusto e cheio de qualidades que
fazem parte de um ambiente em cloud computing.

NFS
O Network File System é um sistema de arquivos desenvolvido pela Sun Microsystems para
compartilhar arquivos e diretórios através da rede, de forma transparente, em uma
arquitetura cliente-servidor. Desta forma, um computador pode exportar um diretório local
pela rede, que pode ser montado em estações remotas como se fosse um diretório local. O
NFS é utilizado para compartilhar arquivos em rede entre computadores com Linux e Unix.

SMB
O Server Message Block é um protocolo de compartilhamento criado pela IBM que permite
que os computadores compartilhem arquivos e impressoras pela rede local. A implementação
do SMB da Microsoft foi chamada de CIFS há alguns anos.

Já no Linux a implementação do SMB é através do conjunto de ferramentas chamada de


SAMBA. O SAMBA permite que Windows e Linux compartilhem impressoras e arquivos de
forma transparente para os usuários.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 85


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

CIFS
O Common Internet File System é uma forma de implementação do SMB criada pela
Microsoft há alguns anos. Atualmente a própria Microsoft utiliza outra versão do SMB,
chamada de SMB 2 ou SMB 3, dependendo da versão do Windows.

Multipath

O Linux suporta um esquema de mapeamento de dispositivos chamado Multipath. Este


esquema possibilita a configuração de múltiplos caminhos de entrada e saída de dados para
acessar múltiplos dispositivos.

Também conhecido como DM-Multipathing, este esquema fornece proteção contra falhas de
entrada-saída (E/S) e balanceamento de carga.

As ferramentas de Multipath no Linux incluem:

dm-multipath: módulo do kernel que permite o suporte ao Multipath;


multipath: comando para ver os dispositivos multipath;
multipathd: programa servidor que monitora os caminhos;
kpartx: programa para configurar dispositivos para o multipath.

O DM-Multipath cria um arquivo representando um dispositivo em multipath no diretório


/dev/mapper, nomeado mpathN para cada dispositivo de armazenamento do sistema. O N
representa o número do driver.

Criando Partições

Os programas fdisk e gdisk e parted sã o responsá veis por criar as partições de disco.

fdisk
# fdisk [dispositivo]

O fdisk é um utilitá rio para criar, listar, alterar e apagar partições de disco. Ele é muito
robusto e possibilita criarmos uma lista grande de tipos de partiçõ e s para o Linux e
diferentes sistemas operacionais. O fdisk funciona em modo texto na forma de diálogo
amigá vel.

O fdisk é capaz de manipular tabelas de partições GPT, MBR, Sun, SGI e BSD.

86 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

A opção -l do fdisk lista todos os discos e partições encontrados no sistema:

$ sudo fdisk -l
Disco /dev/xvda: 8 GiB, 8589934592 bytes, 16777216 setores
Unidades: setor de 1 * 512 = 512 bytes
Tamanho de setor (lógico/físico): 512 bytes / 512 bytes
Tamanho E/S (mínimo/ótimo): 512 bytes / 512 bytes
Tipo de rótulo do disco: gpt
Identificador do disco: 33E98A7E-CCDF-4AF7-8A35-DA18E704CDD4

Dispositivo Início Fim Setores Tamanho Tipo


/dev/xvda1 4096 16777182 16773087 8G Linux sistema de
arquivos
/dev/xvda128 2048 4095 2048 1M BIOS inicialização
Disco /dev/xvdb: 8 GiB, 8589934592 bytes, 16777216 setores
Unidades: setor de 1 * 512 = 512 bytes
Tamanho de setor (lógico/físico): 512 bytes / 512 bytes
Tamanho E/S (mínimo/ótimo): 512 bytes / 512 bytes

Neste exemplo acima, o sistema tem dois discos xvda e xvdb. O primeiro disco tem uma
partição de 8GB e uma partição de boot e 1MB e usa o sistema GPT. O segundo disco de 8GB
está sem nenhuma partição criada.

Em sistemas em Cloud Computing é comum os discos usarem a nomenclatura "xvd" para


designar os discos no lugar de "sd".

Para particionar o disco você deverá passar como parâmetro para o fdisk o dispositivo de
blocos que deseja trabalhar. É preciso ter permissões de root para alterar as partições.

# fdisk /dev/xvdb

Bem-vindo ao fdisk (util-linux 2.30.2).


As alterações permanecerão apenas na memória, até que você decida
gravá-las.
Tenha cuidado antes de usar o comando de gravação.

A unidade não contém uma tabela de partição conhecida.


Criado um novo rótulo de disco DOS com o identificador de disco
0xa8431f5e.

Comando (m para ajuda):

Neste exemplo o fdisk vai poder particionar o disco virtual xvdb.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 87


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

As opções de menu mais frequentes sã o:

DOS (MBR)
a alterna a opção de inicialização
b edita o rótulo do disco BSD aninhado
c alterna a opção "compatibilidade"

Genérico
d exclui uma partição
F lista partições não particionadas livres
l lista os tipos de partições conhecidas
n adiciona uma nova partição
p mostra a tabela de partição
t altera o tipo da partição
v verifica a tabela de partição
i mostra informação sobre uma partição

Miscelânea

m mostra este menu


u altera as unidades das entradas mostradas
x funcionalidade adicional (somente para usuários avançados)

Script
I carrega layout de disco de um arquivo script de sfdisk
O despeja layout de disco para um arquivo script de sfdisk

Salvar & sair


w grava a tabela no disco e sai
q sai sem salvar as alterações

Cria um novo rótulo


g cria uma nova tabela de partição GPT vazia
G cria uma nova tabela de partição SGI (IRIX) vazia
o cria uma nova tabela de partição DOS vazia
s cria uma nova tabela de partição Sun vazia

Para criar uma nova partição do tipo MBR você deverá escolher a opção “n” no fdisk. Depois
você terá de escolher se a nova partição será primá ria, estendida ou ló gica. Se a partição for
primá ria ou estendida, você terá de entrar o nú mero da partição de 1 a 4. Se a partição for
ló gica, o fdisk se encarrega de numerar para você .

Neste exemplo abaixo foi criada uma partição primária de 8GB usando a tabela MBR:

88 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

# fdisk /dev/xvdb
Bem-vindo ao fdisk (util-linux 2.30.2).
As alterações permanecerão apenas na memória, até que você decida
gravá-las.
Tenha cuidado antes de usar o comando de gravação.
A unidade não contém uma tabela de partição conhecida.
Criado um novo rótulo de disco DOS com o identificador de disco
0x5cfd153d.
Comando (m para ajuda): n
Tipo da partição
p primária (0 primárias, 0 estendidas, 4 livre)
e estendida (recipiente para partições lógicas)
Selecione (padrão p): p
Número da partição (1-4, padrão 1): 1
Primeiro setor (2048-16777215, padrão 2048):
Último setor, +setores ou +tamanho{K,M,G,T,P} (2048-16777215,
padrão 16777215):
Criada uma nova partição 1 do tipo "Linux" e de tamanho 8 GiB.

O tamanho da partição deverá ser escolhido digitando o cilindro inicial e o cilindro final
desejado ou pelo tamanho em megabytes ou gigabytes. Por exemplo, para criar uma
partição de 1 giga, você pode digitar +1024M ou +1G.

Se você quiser utilizar o GPT para criar uma partição, use a opção "g" e depois a opção "n".

# fdisk /dev/xvdb
Bem-vindo ao fdisk (util-linux 2.30.2).
As alterações permanecerão apenas na memória, até que você decida
gravá-las.
Tenha cuidado antes de usar o comando de gravação.
A unidade não contém uma tabela de partição conhecida.
Criado um novo rótulo de disco DOS com o identificador de disco
0x7395e584.

Comando (m para ajuda): g


Criado um novo rótulo de disco GPT (GUID:
DAA9FD3A-6F1B-4324-9BF3-4AABE4134037).
Comando (m para ajuda): n
Número da partição (1-128, padrão 1): 1
Primeiro setor (2048-16777182, padrão 2048):
Último setor, +setores ou +tamanho{K,M,G,T,P} (2048-16777182,
padrão 16777182):
Criada uma nova partição 1 do tipo "Linux filesystem" e de

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 89


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

tamanho 8 GiB.

Por padrã o, toda as partições sã o criadas com o tipo 83 Linux.

Se você desejar um outro tipo de partição, como a swap, deverá criar a partição e depois
mudar o seu tipo com a opção “t”.

Veja os tipos de partição que o Linux suporta:

Figura 8 - Tipos de Partição

Uma vez que você definiu as partições, é necessário gravar os dados na tabela de partições
com a opção "w".

parted
# parted [opções] [dispositivo [comando] [opções]]

O comando parted foi desenvolvido para particionar e redimensionar partições de discos. Ele
permite criar, destruir, redimensionar, mover e copiar partições do tipo ext2, Linux-swap,
FAT, FAT32, reiserFS e HFS. Ele é muito ú til para reorganizar o uso do disco, bem como copiar
dados para novos discos.

Sua utilização é para usuários mais experimentados, já que ele pode criar partições
diretamente no prompt do shell.

Se nenhum comando for informado como parâmetro, o parted irá mostrar seu próprio prompt
90 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

de comandos.

Os comandos podem ser:

mklabel label-type
Cria uma nova tabela de partições, que podem ser do tipo "aix", "amiga", "bsd", "dvh",
"gpt", "loop", "mac", "msdos", "pc98", ou "sun".

mkpart part-type [fs-type] start end


Cria uma partição.
O part-type pode ser "primary", "logical", ou "extended".
O fs-type espeficifa o tipo de sistema de arquivos, que pode ou não ser informado. Os
tipos de sistema aceitos são: "btrfs", "ext2", "ext3", "ext4", "fat16", "fat32", "hfs",
"hfs+", "linux-swap", "ntfs", "reiserfs" e "xfs".
O parâmetro start define o inicio da partição. É um número inteiro seguido de uma
unidade.
O parâmetro end define o fim da partição. É um número inteiro seguido de uma
unidade.
A unidade pode ser a letra "s" de Setor, se o número informado for um setor no disco,
ou "B" para informar o início e fim da partição em Bytes. Também é possível definir o
inicio e fim das partições em unidades binárias como “MiB”, “GiB” e “TiB”.

name nome
Este comando permite dar um nome para a partição. Somente pode ser usado em
tabelas de partição do tipo Mac, PC98, e GPT.

print
Mostra informações sobre uma partição.

Para criar uma tabela de partições GPT no disco /dev/xvdb:

$ parted /dev/xvdb mklabel gpt


Aviso: The existing disk label on /dev/xvdb will be destroyed and
all data on this disk will be lost. Do you
want to continue?
Sim/Yes/Não/No? Yes

Depois de criado a tabela de partições, pode-se criar a partição:

# parted /dev/xvdb mkpart primary btrfs 1MiB 100%


Informação: You may need to update /etc/fstab.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 91


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

O parted também permite ver a partição recém criada com o comando print:

# parted /dev/xvdb print


Model: Xen Virtual Block Device (xvd)
Disk /dev/xvdb: 8590MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Sinalizador
1 1049kB 8589MB 8588MB primary

gdisk
# gdisk [opções] dispositivo

O comando gdisk é similar ao fdisk e permite manipular e criar partiç õ es. Ele foi
especialmente criado para lidar com partições GPT.

Ele converte automaticamente o Master Boot Record (MBR) para o novo formato chamado
Globally Unique Identifier Partition Table (GPT).

Este novo esquema de tabela de alocação de partições foi criado para funcionar com os
novos firmwares das placas-mã e EFI e UEFI. O Windows XP 32- bit e versõ es anteriores do
Windows nã o podem normalmente ler ou escrever em unidades formatadas com uma tabela
de partiçã o GUID, no entanto, Windows Vista e Windows 7 e Windows 8 possuem esta
capacidade.

Este novo padrã o utiliza o endereça mento de bloco ló g ico (LBA) no lugar do antigo
endereçamento cilindro-cabeça-setor. Este sistema de endereçamento nã o possui a limitação
de enquadrar o gerenciador de boot nos primeiros 1024 cilindros.

Os menus do gdisk, embora com mais opções, sã o bem similares ao do fdisk. As opções do
gdisk são:

b Faz backup do GPT em um arquivo


c Muda o nome da partição
d Apaga uma partição
i Mostra informações detalhadas de uma partição
l Lista os tipos de partição
n Cria uma nova partição
o Cria uma tabela GUID partition table (GPT) vazia
p Mostra dados da partição
q Sai sem salvar

92 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

r Recuperação e transformação (para experts)


s Ordena as partições
t Muda o tipo de partição
v Verifica o disco
w Grava a tabela de partições
x Funcionalidades extras (para experts)
? Imprime este menu

Neste exemplo foi criada uma partição do tipo GPT no disco /dev/xvdb. Se nada for digitado
no prompt interativo, ele vai assumir as opções padrão:

# gdisk /dev/xvdb
GPT fdisk (gdisk) version 0.8.6
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
Found valid GPT with protective MBR; using GPT.
Command (? for help): n
Partition number (1-128, default 1):
First sector (34-16777182, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-16777182, default = 16777182) or {+-
}size{KMGTP}:
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'
Command (? for help): w
Final checks complete. About to write GPT data. THIS WILL
OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/xvdb.
The operation has completed successfully.

Criando Sistemas de Arquivos

Uma vez que as partições já estão definidas, pode-se criar o Sistema de Arquivos que será
utilizado. O Linux suporta vários sistemas de arquivos e sua escolha depende muito da
utilidade que se dará ao sistema e também o tipo de disco.

Os discos formatados com ext2, ext3 e ext4 possuem uma gama grande de ferramentas.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 93


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Como utiliza um tamanho de bloco fixo, não são bons sistemas de arquivos para pequenos
arquivos, pois podem consumir muito disco desnecessariamente.

Por exemplo, o ext4 usa como padrão blocos de 4K. Se você tem muitos arquivos pequenos
como de 1k, cada arquivo vai usar um bloco inteiro de 4k, mesmo que seu tamanho seja
menor que isso.

O XFS por sua vez é excelente na execução de operações paralelas de entrada/saída (E/S)
com uso de vários discos físicos, pois foi desenhado para alto desempenho de estações
gráficas. Ele é ideal para aplicações que editam imagens e vídeos.

Já o BTRFS parece ser a escolha mais acertada, já que permite snapshots, compactação,
desfragmentação e tantas outras vantagens, mas nem sempre disponível em todas as
distribuições.

A tabela a seguir vai ajudá-lo na escolha do sistema de arquivos:

Tipo de Sugestão de Vantagens Desvantagens


Sistema de Utilização
Arquivos

ext2 Usado no /boot e em Simples e rápido Não possui journaling


pendrives

ext3 Uso geral no Linux Acrescenta Journaling ao ex2 Não tão rápido e confiável como
sem precisar formatar ext4

ext4 Uso geral no Linux Melhor desempenho e Não permite uma série de
confiabilidade que o ext3 funcionalidades que o BTRFS
tem

XFS Uso geral no Linux Melhor desempenho que o Não permite uma série de
ext3. Ideal para vídeos. funcionalidades que o BTRFS
tem

ReiserFS Não é mais usado Eficiente para arquivos Consumo elevado de CPU
pequenos

VFAT Cartões de memória e Portabilidade fácil com Todas :-)


pendrive Windows

BTRFS Uso geral no Linux Todas :-) Virtualmente nenhuma

Os utilitários mkfs e mkswap são usados para criar sistemas de arquivos e de swap,
respectivamente.

mkfs
# mkfs [-t tipo] [opções] dispositivo

O comando mkfs formata a partição criada pelo fdisk / gdisk / parted com o sistema de
arquivos.

94 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

O tipo de sistema de arquivos é definido pela opção –t e são os formatos nativos ext2, ext3,
ext4, fat, vfat, minix, msdos e xfs.

Os comandos mke2fs e mkdosfs são variações do mkfs.

O mkfs possui algumas variações que permitem escolher o tipo de sistema de arquivos
diretamente:

$ ls -l /usr/sbin/mk*
lrwxrwxrwx 1 root root 8 ago 29 22:48 /usr/sbin/mkdosfs ->
mkfs.fat
-rwxr-xr-x 4 root root 96328 jul 26 2018 /usr/sbin/mke2fs
-rwxr-xr-x 1 root root 11432 jul 26 2018 /usr/sbin/mkfs
-rwxr-xr-x 4 root root 96328 jul 26 2018 /usr/sbin/mkfs.ext2
-rwxr-xr-x 4 root root 96328 jul 26 2018 /usr/sbin/mkfs.ext3
-rwxr-xr-x 4 root root 96328 jul 26 2018 /usr/sbin/mkfs.ext4
-rwxr-xr-x 1 root root 28512 ago 2 2018 /usr/sbin/mkfs.fat
-rwxr-xr-x 1 root root 83824 jul 26 2018 /usr/sbin/mkfs.minix
lrwxrwxrwx 1 root root 8 ago 29 22:48 /usr/sbin/mkfs.msdos
-> mkfs.fat
lrwxrwxrwx 1 root root 8 ago 29 22:48 /usr/sbin/mkfs.vfat ->
mkfs.fat
-rwxr-xr-x 1 root root 372448 jan 24 2019 /usr/sbin/mkfs.xfs

Dependendo da variação que você escolher, o mkfs pode ter mais ou menos opções.

De maneira geral, as opções possíveis do comando mkfs são:

-t: Informa qual o tipo de formatação a partição deverá ser


-c: Verifica a existência de bad blocks (defeitos) no dispositivo;
-L: nome Configura o nome do dispositivo;
-n: nome Configura o nome do dispositivo para o formato msdos;
-q: Faz com que o mkfs trabalhe com o mínimo de saída no vídeo possível;
-v: Faz com que o mkfs trabalhe com o máximo de saída no vídeo possível;
-m: Percentual de disco reservado

Uma opção interessante do mkfs é o “-m percentual” que permite reservar um espaço do
disco em percentual para evitar o travamento do sistema em caso de disco cheio. A ideia é o
sistema operacional alertar que o disco está cheio para os usuários comuns, ANTES do disco
estar realmente completamente cheio. Isso permite que o sistema continue funcionando por
um tempo até que o administrador possa tomar alguma medida para evitar que um disco
realmente cheio trave o funcionamento do sistema ou ocasione perda de dados.

Exemplo:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 95


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Formata com sistema de arquivos ext3:

# mkfs.ext3 /dev/xvdb1
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux

Block size=4096 (log=2)


Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
524288 inodes, 2096891 blocks
104844 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2147483648
64 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

Formata o disco com xfs:

# mkfs.xfs /dev/xvdb1
meta-data=/dev/xvdb1 isize=512 agcount=4,
agsize=524223 blks
= sectsz=512 attr=2,
projid32bit=1
= crc=1 finobt=1, sparse=0
data = bsize=4096 blocks=2096891,
imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560,
version=2
= sectsz=512 sunit=0 blks, lazy-
count=1
realtime =none extsz=4096 blocks=0,
96 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

rtextents=0

Filesystem Hierarchy Standard

A necessidade de guardar informações em objetos que pudessem ser acessados


posteriormente de uma forma organizada vem de longe nos sistemas operacionais. Para isso
foram criados os sistemas de arquivos.

Nos sistemas de arquivos de uma forma geral, os objetos são organizados de uma forma
hierárquica e cada objeto possui uma identificação única dentro de uma tabela.

Como exemplo, vejamos o sistema operacional Windows da Microsoft: ele organiza seus
arquivos em uma partição nomeada como drive “C:\”, e nela temos o diretório Windows, que
contém o sistema operacional; o diretório “Arquivos de Programas”, que contém a maioria
dos produtos instalados, e assim por diante. Os arquivos ficam divididos em diretórios e
subdiretórios diferentes por uma questão de afinidade e organização. Da mesma maneira
temos uma organização no Linux.

A identificação dos objetos de um sistema de arquivo no Linux é conhecida como inode. Ele
carrega as informações de onde o objeto está localizado no disco, informações de segurança,
data e hora de criação e última modificação dentre outras. Quando criamos um sistema de
arquivos no Linux, cada dispositivo tem um número finito de inodes que será diretamente
proporcional ao número de arquivos que este dispositivo poderá acomodar.

Basicamente no Linux tudo é um arquivo, que dependendo do seu tipo, pode se tornar um
arquivo comum, um diretório, um link, um socket, um condutor, um descritor de dispositivos,
etc.

Comparando com o Windows, a organização dos diretórios no Linux é um pouco mais


complexa. O sistema de arquivos no Linux é semelhante a uma árvore de cabeça para baixo.
No topo da hierarquia do Linux existe um diretório raiz nomeado simplesmente como root e
identificado como o sinal “/”. Não confunda diretório raiz (root) com o superusuário root.

A estrutura do sistema de arquivos do Linux é definida por um padrão de mercado chamado


Filesystem Hierarchy Standard ou FHS, criado pela comunidade Linux em 1994 e mantida
pela Linux Foundation. Atualmente a FHS está na versão 3.0. As distribuições não são
obrigadas a seguir este padrão, mas elas entendem a importância da localização dos
arquivos e diretórios padronizados.

Toda a estrutura de diretórios do sistema é criada abaixo do root:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 97


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Figura 9 - FHS

/
Diretório raiz do sistema de arquivos;

/bin
Contêm os comandos que podem ser utilizados pelos usuários e pelo administrador do
sistema. São requeridos no modo monousuário ou de manutenção (single-user mode) e
também podem conter comandos que são utilizados indiretamente por alguns scripts. Nele
ficam os arquivos executáveis, tais como: cat, chgrp, chmod, chown, cp, date, dd, df, dmesg,
echo, hostname, kill, ln, more, mount, mv, ps, pwd, rm, rmdir, sed, su, umount e uname;

/boot
Arquivos estáticos necessários à carga do sistema. É onde fica localizada a imagem do
Kernel, initramfs e alguns arquivos do Grub. Este diretório contém tudo que é necessário
para carregar o sistema, exceto os arquivos de configuração e o gerenciador de boot. O /boot
inclui o setor master de carga do sistema (master boot sectors) e arquivos de mapa de setor.

/dev
Abstração do Kernel onde ficam os arquivos para acesso dos dispositivos do sistema, como
discos, cd-roms, pendrives, portas seriais, terminais, etc. Os arquivos são descritores que
facilitam o acesso aos dispositivos. Este diretório é um pseudo-filesystem, e não existe no
disco. Seu conteúdo, por exemplo, tem descritores de dispositivos como /dev/sda,
/dev/cdrom, etc.

98 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

/etc
Arquivos necessários à configuração do sistema. São necessários para a carga do sistema
operacional. Ele possui arquivos importantes tais como: fstab, exports, passwd, shadow,
group, hosts, hosts.allow, hosts.deny, inittab, ld.so.conf, mtab, profile, services, etc. Nele
também residem os arquivos de configuração nas interfaces de rede.

Tipicamente /etc possui dois subdiretórios:

/etc/X11: Arquivos de configuração para a interface gráfica do Linux (X Window


System);

/etc/skel: Esqueletos da configuração usuários. No diretório /etc/skel ficam localizados


os arquivos de "modelo” para os usuários. O conteúdo deste diretório é replicado para o
diretório home dos novos usuários quando são criados no sistema.

/home
Geralmente é neste diretório onde ficam os diretórios home dos usuários. Neste diretórios
localizam-se scripts de carga de perfil e do shell bash de cada usuário.

/lib
Arquivos de bibliotecas essenciais ao sistema, utilizadas pelos programas em /bin e módulos
do Kernel. É comum existir um diretório /lib[arquitetura]. Nos processadores de 64 bits,
existe o diretório /lib64. Nos processadores de 32 bits, deve existir um diretório /lib32.

/mnt
Diretório vazio utilizado como ponto de montagem de dispositivos na máquina. Usado pelo
administrador para montar discos.

/media
Diretório vazio utilizado como ponto de montagem de dispositivos na máquina, tais como
cdrom, dvd, pendrives, etc.

/proc
Informações do Kernel e dos processos. É um pseudo-filesystem e não existe realmente no
disco. Neste diretório ficam as abstrações de descritores de tudo quanto há no Kernel do
sistema. É possível não só ler os dados, bem como fazer alterações no comportamento do
Kernel alterando o conteúdo de arquivos em /proc.

/opt
Neste diretório ficam instalados os aplicativos que não são da distribuição do Linux, como por
exemplo, banco de dados de terceiros, software de vetores Cad, etc.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 99


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

/root
Diretório home do superusuário root. Dependendo da distribuição pode estar presente ou
não;

/run
Este diretório contém informações do sistema desde a última carga. Os arquivos deste
diretório são apagados ou zerados no início do processo de boot. Arquivos como aqueles que
indicam o PID do processo em execução devem residir neste diretório.

/sbin
Arquivos essenciais ao sistema, como aplicativos e utilitários para a administração da
máquina. Normalmente só o superusuário tem acesso a estes arquivos, tais como: fdiskm
fsck, ifconfig, init, mkfs, mkswap, route, reboot, swapon e swapoff.

/tmp
Diretório de arquivos temporários. Em algumas distribuições este diretório é montado em
memória. Recomenda-se que seu conteúdo seja apagado de tempos em tempos ou a cada
reboot.

/usr
Arquivos pertencentes aos usuários e a segunda maior hierarquia de diretórios no Linux. Seu
conteúdo pode ser distribuído via rede para diversos sistemas Linux da mesma distribuição
sem problema algum. Ele tem alguns subdiretórios a saber:

/usr/bin: Ferramentas e comandos auxiliares de usuários, bem como interpretadores


de programação, como o perl, python, etc;

/usr/include: Cabeçalhos e bibliotecas da linguagem C;

/usr/lib e /usr/lib64: bibliotecas de aplicações de usuários;

/usr/libexec: binários que não são executados normalmente por usuários;

/usr/local: hierarquia de diretórios para instalação de aplicativos locais no sistema.


Possui vários subdirtórios como bin, etc, include, lib, man, sbin, share e src;

/usr/sbin: contém ferramentas não essesnciais, mas exclusivas da administração do


sistema.

/usr/share: arquivos de somente leitura de arquitetura independente. São arquivos


que podem ser compartilhados entre distribuições de Linux iguais, independente da
arquitetura. O diretório man por exemplo é onde residem os manuais dos comandos e
fica em /usr/share.

/usr/src: pode conter arquivos de código fonte de programas.


100 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

/var
Diretório onde são guardadas informações variáveis sobre o sistema, como arquivos de log,
arquivos de e-mail etc. Possui subdiretórios importantes, a saber:

/var/cache: mantém informações de cache das aplicações como cálculos, etc;

/var/lib: mantém informações de estado das aplicações;

/var/lock: mantém arquivos de trancamento que retém dispositivos para uso exclusivo
de alguma determinada aplicação;

/var/log: mantém os arquivos de log do sistema, tais como messages, lastlog e wtmp.

/var/mail: mantém os diretórios de contas de email dos usuários;

/var/opt: mantém os arquivos variáveis das aplicações;

/var/run: a funcionalidade deste diretório foi movida para o /run.

/var/spool: mantém dados de processos que mantém filas de arquivos, tais impressão
e saída de email;

/var/tmp: mantém os arquivos temporários das aplicações que precisem ser


preservados entre o reboot do sistema

No exame, o candidato deve demonstrar a proficiência da estrutura de diretórios, bem como


a localização dos arquivos nesta estrutura.

Integridade do Sistema de Arquivos

Este tópico aborda como verificar a integridade do sistema de arquivos, monitorar o espaço
livre e inodes livres, bem como fazer pequenos reparos no sistema de arquivos.

Monitorar as estatísticas dos discos


O utilitário iostat mostra as estatísticas de uso da CPU, bem como as estatísticas de entrada
e saída de dados dos discos. Nem sempre este utilitário está instalado como padrão no Linux.

Veja o exemplo:

$ iostat
Linux (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
1,67 0,00 0,76 0,32 0,16 97,09
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 101


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

xvda 5,66 98,18 13,30 131259164 17777186


xvdb 1,84 17,87 20,47 23891104 27371232

Este comando mostra as estatísticas desde o boot do sistema, a menos que a opção -y for
utilizada para informar o intervalo em segundos.

No caso dos discos, as colunas do iostat mostram as seguintes informações:

TPS: transferências por segundo;


kB_read/s: KB lidos por segundo;
kB_wrtn/s: KB gravados por segundo;
kB_read: total de blocos lidos;
kB_wrtn: total de blocos gravados;

Monitorar o Espaço Livre


O Linux possui dois comandos que são úteis para monitorar o espaço em disco e inodes. O
comando "df" pode ser usado para monitorar o espaço livre no disco bem como os inodes. Já
o comando "du" informa o uso do disco.

df
$ df [opções] [diretórios]

O comando df (disk free) mostra a capacidade utilizada de um sistema de arquivos em


termos de espaço e inodes.

Um inode é uma estrutura de dados que descreve um objeto do sistema de arquivos, que
pode ser uma de várias coisas, incluindo um arquivo ou diretório. Cada inode armazena os
atributos e a(s) localização(ões) de bloco de disco dos dados dos objetos. Atributos de objeto
do sistema de arquivos podem incluir metadados (horários de última alteração, acesso e
modificação), bem como dados de proprietário e permissão (por exemplo, id de grupo, id de
usuário, permissões).

Como o número de inodes está diretamente ligado ao número de arquivos que um dispositivo
pode armazenar, é possível que ele acabe e ainda tenhamos espaço disponível em disco. Isso
é raro, mas pode acontecer quando temos um número enorme de pequenos arquivos. O
número de inodes é definido na formação do disco.

Ele pode receber como parâmetro o sistema de arquivos que se deseja informações Se
nenhum nome de arquivo for fornecido, o df mostra o espaço disponível em todos os
sistemas de arquivos atualmente montados. O espaço em disco é mostrado em blocos de 1K
por padrão.

Neste exemplo o df mostra a capacidade do disco montado como raiz / :

102 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

$ df /
Sist. Arq. 1K-blocos Usado Disponível Uso% Montado em
/dev/mapper/cl-root 42954248 8079412 34874836 19% /

A opção -i do df mostra a quantidade de inodes disponível:

$ df -i /
Sist. Arq. Inodes IUsado ILivr IUso% Montado em
/dev/mapper/cl-root 21487616 174290 21313326 1% /

A leitura do espaço ocupado e disponível pode ser feita de forma mais fácil com a opção -h:

$ df -h /
Sist. Arq. Tam. Usado Disp. Uso% Montado em
/dev/mapper/cl-root 41G 7,8G 34G 19% /

Sem informar o arquivo, o df mostra a informação de todos os discos montados:

$ df -h
Sist. Arq. Tam. Usado Disp. Uso% Montado em
devtmpfs 979M 0 979M 0% /dev
tmpfs 996M 0 996M 0% /dev/shm
tmpfs 996M 420K 996M 1% /run
tmpfs 996M 0 996M 0% /sys/fs/cgroup
/dev/xvda1 8,0G 4,7G 3,4G 58% /
/dev/xvdf 20G 12G 7,4G 61% /home
tmpfs 200M 0 200M 0% /run/user/1000

du
$ du [opções] [diretórios]

O comando du (disk usage) vai fornecer uma lista detalhada sobre a utilização do disco.

É muito útil para determinarmos para onde foi o espaço disponível em disco, de forma que
você pode investigar qual diretório está consumindo o disco.

Se não passarmos um diretório como parâmetro, ele usa o diretório corrente como base de
pesquisa.

As opções mais frequentes são:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 103


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

-a: Mostra todos os arquivos e não somente diretórios;


-c: Mostra um total no final da listagem;
-h: Mostra as informações de forma mais simples. Utiliza as letras M para megabytes
e G para gigabytes;
-s: Mostra um sumário do diretório especificado e não o total de cada subdiretório;
-S: Exclui os subdiretórios da contagem;

Exemplos:

$ du –h /home
2M /home/carla
4M /home/cristiane
5M /home/guilherme
1M /home/michel

Com a opção -sh, ele mostra o totalizador, incluindo os subdiretórios:

$ du –sh /home
12M /home

Com a opção -Sh, ele mostra o totalizador, excluindo os subdiretórios:

$ du –Sh /home
1k /home

Se quiser saber o total de cada subdiretório:

$ du -sh ./*/
291M ./carlacru/
173M ./freud/
142M ./mario/
181M ./odonto/
273M ./oficina/

A opção --inodes mostra a contagem de inodes:

$ du -s --inodes ./*/
75 ./desafio/
15 ./funnel/
2 ./musicas/

104 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Pode-se investigar todo o disco, desde a raiz / :

# du -sh ./*/
221M ./bin/
125M ./boot/
0 ./dev/
32M ./etc/
12G ./home/
513M ./lib/
219M ./lib64/
0 ./media/
0 ./mnt/
120K ./opt/
0 ./proc/
145M ./root/
420K ./run/
43M ./sbin/
0 ./sys/
21M ./tmp/
527M ./usr/
2,8G ./var/

Observe que os pseudo-sistemas de arquivos como o /proc, /dev e /sys não ocupam espaço
em disco porque na realidade são abstrações do Kernel e subsistemas.

Reparar o Sistema de Arquivos

O Linux é um sistema operacional muito sólido. Seu sistema de arquivos, especialmente ex4,
xfs e brtfs, são construídos para se recuperar de falhas de disco e evitar ao máximo perda de
dados e inconsistências. Mas isso não garante que o hardware estará imune a falhas,
principalmente com incidentes como quedas, descargas elétricas e falta repentina de
energia.

E quando uma falha de disco acontece, o Linux tem algumas ferramentas que ajudam na
deteção de problemas e recuperação de dados.

fsck
# fsck [opcões] [-t tipo] [opções do tipo] dispositivo

O comando fsck é na verdade um "wrapper" que serve para chamar outros comandos que
são variações do fsck para vários tipos de sistemas de arquivos.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 105


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Você pode perceber isso com o comando ls no diretório /usr/sbin:

$ ls -l /usr/sbin/*fsck*
lrwxrwxrwx 1 root root 8 mar 8 2019 /usr/sbin/dosfsck ->
fsck.fat
-rwxr-xr-x 4 root root 256424 jul 26 2018 /usr/sbin/e2fsck
-rwxr-xr-x 1 root root 49896 jul 26 2018 /usr/sbin/fsck
-rwxr-xr-x 1 root root 37200 jul 26 2018 /usr/sbin/fsck.cramfs
-rwxr-xr-x 4 root root 256424 jul 26 2018 /usr/sbin/fsck.ext2
-rwxr-xr-x 4 root root 256424 jul 26 2018 /usr/sbin/fsck.ext3
-rwxr-xr-x 4 root root 256424 jul 26 2018 /usr/sbin/fsck.ext4
-rwxr-xr-x 1 root root 57424 ago 2 2018 /usr/sbin/fsck.fat
-rwxr-xr-x 1 root root 83536 jul 26 2018 /usr/sbin/fsck.minix
lrwxrwxrwx 1 root root 8 mar 8 2019 /usr/sbin/fsck.msdos
-> fsck.fat
lrwxrwxrwx 1 root root 8 mar 8 2019 /usr/sbin/fsck.vfat ->
fsck.fat
-rwxr-xr-x 1 root root 433 jan 24 2019 /usr/sbin/fsck.xfs

Dependendo do sistema de arquivos, o fsck invoca o fsck.algumacoisa apropriado para lidar


com aquele sistema de arquivos.

O objetivo do fsck é checar e corriger a existência de erros no sistema de arquivos. Por


padrão, o fsck assume o sistema de arquivos ext2 e, após fazer uma checagem no disco,
pergunta ao usuário se ele deseja fazer as correções necessárias.

Como parâmetro o fsck aceita um nome de dispositivo (ex.: /dev/hdc1, /dev/sdb2), um ponto
de montagem (ex: /, /usr, /home), ou um Label (ex.: LABEL=root) ou uma identificação de
disco UUID (ex.: UUID=8868abf6-88c5-4a83-98b8-bfc24057f7bd ).

Um identificador UUID é um número único que identifica um disco, como se fosse o "MAC
Address dos discos".

As opções frequentemente usadas são:

-A: Faz a checagem de todos os discos especificados no arquivo /etc/fstab;


-t: Especifica o tipo de sistema de arquivos que deverá ser checado;

Ainda podemos ter algumas opções para o sistema de arquivos ext2:

-b: Superbloco Especifica qual superbloco o fsck irá trabalhar;


-c: Faz checagem de setores defeituosos (bad blocks);
-f: Força a checagem do sistema de arquivos mesmo que este pareça íntegro;
-p: Repara automaticamente o sistema de arquivos;
-y: Executa o fsck de modo não interativo, não fazendo nenhuma pergunta ao
usuário;
106 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

Um superbloco é uma área especial no disco com informações importantes dos parâmetros
do sistema de arquivos e o seu estado atual. Geralmente o superbloco é copiado em diversas
áreas no disco como backup.

O fsck precisa que o disco esteja desmontado para realizar a checagem e reparos:

# fsck /dev/xvdb1
/dev/xvdb1 is in use.

Uma vez desmontado o sistema de arquivos:

# fsck.ext4 /dev/xvdb1
e2fsck 1.42.9 (28-Dec-2013)
/dev/xvdb1: clean, 41436/524288 files, 374905/2096891 blocks

Dependendo do tamanho e dos inúmeros reparos que a partição necessita, o processo do


fsck pode demorar horas.

Para verificar a partição do sistema raiz há duas opções:

1. Usar um Pendrive com Linux para dar carga em outro Linux e verificar a partição;
2. Usar o comando "touch /forcefsck" para criar o arquivo forcefsck, que força o linux a
verificar a partição raiz no boot do sistema

e2fsck
# e2fsck [opções] dispositivo

O comando e2fsck é usado para checar o sistema de arquivos ext2, ext3 e ext4. Ele é a
versão do fsck para os sistemas de arquivos baseados no sistema de arquivos ext.

As opções são comuns ao fsck, já que é ele que é invocado pelo fsck quando se trata de
partições do tipo ext2, ext3 e ext4.

Exemplo:

$ sudo fsck.ext4 /dev/xvdb1


e2fsck 1.42.9 (28-Dec-2013)
/dev/xvdb1: clean, 41436/524288 files, 374905/2096891 blocks

debugfs
# debugfs [opções] [dispositivo]

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 107


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

O programa debugfs é um depurador interativo do sistema de arquivos ext2.

Ele é utilizado para examinar e alterar o estado do sistema de arquivos. Ele abre um prompt
próprio, que permite comandos que alteram e examinam o estado do sistema de arquivos.

Exemplo:

$ sudo debugfs /dev/sda1


debugfs: ?
Available debugfs requests:
show_debugfs_params Show debugfs parameters
open_filesys, open Open a filesystem
close_filesys, close Close the filesystem
freefrag, e2freefrag Report free space fragmentation
feature, features Set/print superblock features
( ... )

dumpe2fs
# dumpe2fs [opções] [dispositivo]

O programa dumpe2fs mostra as informações do superbloco do sistema de arquivos do


dispositivo desejado.

O superbloco é uma área especial do sistema de arquivos que contém informações


importantes sobre o sistema de arquivos, tais como: o tipo de sistema de arquivos, tamanho,
status e informações sobre os metadados.

Exemplo:

$ sudo dumpe2fs /dev/sda1


Filesystem volume name: <none>
Last mounted on: /
Filesystem UUID: 810efa9e-d4ce-4f8e-afd7-dc488366fda8
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal
Filesystem flags: signed_directory_hash
( ... )

resize2fs
# resize2fs [opções] [dispositivo] [tamanho]

108 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

O programa resize2fs serve para redimensionar os sistemas de arquivos ext2, ext3 ou ext4.
Desta forma, ele pode ser usado para ampliar ou reduzir um sistema de arquivos, que esteja
desmontado em algum dispositivo de bloco.

Se o sistema de arquivos estiver montado, ele pode ser usado para expandir o tamanho do
sistema de arquivos montado, assumindo que o kernel suporta redimensionamento on-line.
(A partir do kernel Linux 2.6 - para sistemas de arquivos ext3 e ext4).

O parâmetro size especifica o novo tamanho solicitado do sistema de arquivos. Se não for
especificada a unidade, ele usará o tamanho do bloco. As unidades podem ser: 's', 'K', 'M' ou
'G', para setores de 512 bytes, kilobytes, megabytes ou gigabytes, respectivamente.

O tamanho do sistema de arquivos nunca pode ser maior que o tamanho da partição. Se o
parâmetro size não for especificado, o resize2fs assumirá o tamanho da partição.

Este comando é utilizado geralmente em dispositivos que usam o LVM para gerenciar os
volumes de disco.

Exemplo:

# resize2fs /dev/xvdb1
resize2fs
Resizing the filesystem on /dev/xvdb1 to 524128 (1k) blocks.
The filesystem on /dev/xvdb1 is now 524128 blocks long.

Não é obrigatório, mas recomendável após mudar o tamanho de um volume, executar o fsck
na partição para ter certeza de que o sistema de arquivos está íntegro.

e2label
# e2label dispositivo label

O programa e2label exibirá ou alterará o rótulo (label) de um disco formatado com ext2, ext3
e ext4.

Se o argumento opcional label não estiver presente, e2label simplesmente exibirá o rótulo
atual do sistema de arquivos.

Se o argumento opcional label for declarado, então e2label irá definir o rótulo do sistema de
arquivos.

Também é possível definir o rótulo do sistema de arquivos usando a opção -L do comando


tune2fs.

Exemplo:

# e2label /dev/sda1 sistema

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 109


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Para ver o rótulo da partição:

# e2label /dev/sda1
sistema

xfs_repair
# xfs_repair [opções] dispositivo

O comando xfs_repair é o fsck do sistema de arquivos XFS.

As opções comuns são:

-f Dispositivo é um arquivo
-L Força zerar o log como último recurso
-l logdev Especifica o dispositivo em que reside o log externo
-n Não modifica, apenas checa

O xfs_repair não é capaz de atuar em uma partição montada.

Exemplo:

# xfs_repair /dev/xvdb1
Phase 1 - find and verify superblock...
Phase 2 - using internal log
- zero log...
- scan filesystem freespace and inode maps...
- found root inode chunk
Phase 3 - for each AG...
- scan and clear agi unlinked lists...
- process known inodes and perform inode discovery...
- agno = 0
- agno = 1
- agno = 2
- agno = 3
- process newly discovered inodes...
Phase 4 - check for duplicate blocks...
- setting up duplicate extent list...
- check for inodes claiming duplicate blocks...
- agno = 0
- agno = 1
- agno = 2
110 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

- agno = 3
Phase 5 - rebuild AG headers and trees...
- reset superblock...
Phase 6 - check inode connectivity...
- resetting contents of realtime bitmap and summary
inodes
- traversing filesystem ...
- traversal finished ...
- moving disconnected inodes to lost+found ...
Phase 7 - verify and correct link counts...
done

xfs_fsr
# xfs_fsr [opções] dispositivo

O comando xfs_fsr melhora a organização dos sistemas de arquivos XFS montados. O


algoritmo de reorganização opera em um arquivo por vez, compactando ou melhorando o
layout das extensões do arquivo (blocos contíguos de dados do arquivo). Funciona como o
desfragmentador de arquivos do XFS.

Se nenhum dispositivo for informado como parâmetro, ele vai operar em todos os
dispositivos xfs montados

Ele trabalha mesmo com o sistema de arquivos montado:

$ sudo mount /dev/xvdb1 /mnt


$ xfs_fsr /mnt
/mnt start inode=0

O xfs_fsr pode rodar por horas em segundo plano, reorganizando e compactando os arquivos
em disco:

$ ps -e | grep xfs
1854 00:00:00 xfsalloc
1855 00:00:00 xfs_mru_cache
1857 00:00:00 xfs-buf/xvda1
1858 00:00:00 xfs-data/xvda1
1859 00:00:00 xfs-conv/xvda1
1860 00:00:00 xfs-cil/xvda1
1861 00:00:00 xfs-reclaim/xvd
1862 00:00:00 xfs-log/xvda1
1863 00:00:00 xfs-eofblocks/x

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 111


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

1864 00:00:00 xfsaild/xvda1


4102 00:00:00 xfs-buf/xvdb1
4103 00:00:00 xfs-data/xvdb1
4104 00:00:00 xfs-conv/xvdb1
4105 00:00:00 xfs-cil/xvdb1
4106 00:00:00 xfs-reclaim/xvd
4107 00:00:00 xfs-log/xvdb1
4108 00:00:00 xfs-eofblocks/x
4109 00:00:00 xfsaild/xvdb1

tune2fs
# tune2fs [opções] dispositivo

O comando tune2fs ajusta vários parâmetros nos sistemas de arquivo ext2, ext3, or ext4.

As possibilidades de ajuste possíveis podem ser visualizadas com a opção -l:

$ tune2fs -l
tune2fs 1.42.9 (28-Dec-2013)
Usage: tune2fs
[-c max_mounts_count]
[-e errors_behavior]
[-g group]

[-i interval[d|m|w]]
[-j]
[-J journal_options]
[-l]
[-m reserved_blocks_percent]
[-o [^]mount_options[,...]]
[-p mmp_update_interval]
[-r reserved_blocks_count]
[-u user]
[-C mount_count]
[-L volume_label]
[-M last_mounted_dir]
[-O [^]feature[,...]]
[-E extended-option[,...]]
[-T last_check_time]
112 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

[-U UUID]
[ -I new_inode_size ] device

A opção -c por exemplo altera o números de reboots em que será necessária uma checagem
de disco com fsck.

# tune2fs -c 5 /dev/sda1

xfs_db
$ xfs_db [opções] dispositivo

O comando xfs_db faz um debug nos sistemas de arquivo XFS.

Ele pode ser útil para visualizar informações do XFS. Ele abre um prompt que permite vários
comandos:

# xfs_db -x /dev/sdg2
xfs_db>

Para ver as informações do superbloco:

xfs_db> sb
xfs_db> p
magicnum = 0x58465342
blocksize = 4096

Para visualizar as informações de um inode em particular:

xfs_db> inode 132


xfs_db> p

core.magic = 0x494e
core.mode = 0100644
core.version = 2
core.format = 2 (extents)

Para ver o fragmentação do disco:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 113


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

xfs_db> frag -d
actual 0, ideal 0, fragmentation factor 0.00%
xfs_db> frag -f
actual 5, ideal 2, fragmentation factor 60.00%

Montando e Desmontando Sistemas de


Arquivos

O sistema de arquivos do Linux é hierárquico e admite que diversos dispositivos sejam


mapeados e utilizados a partir da raiz do sistema / (root).

Desta forma DVD, outros discos, pendrivers etc., poderão ser utilizados de forma bastante
simples, e o usuário enxergará estes dispositivos como um diretório na estrutura do Linux.

O Filesystem Hierarchy Standard (padrão para sistema de arquivos hierárquico) separou dois
diretórios que servirão como hospedeiros para os dispositivos são chamados de ponto de
montagem:

/mnt Ponto de Montagem para sistemas de arquivos montados


momentaneamente, como discos rígidos;
/media Pontos de "montagem" para mídia removível, como CD-ROMs (surgiram na
versão 2.3 do FHS).

Em algumas distribuições o diretório /media contém alguns outros subdiretórios opcionais


para montar mídias removíveis:

cdrom CD-ROM
cdrecorder CD writer
zip Zip drive

Já o diretório /mnt é fornecido para que o administrador do sistema possa montar


temporariamente um sistema de arquivos, conforme necessário.

Este diretório não deve ser utilizado pelos programas de instalação: um diretório temporário
adequado que não esteja sendo utilizado pelo sistema deve ser utilizado.Geralmente estes
diretórios ficam vazios quando não estão com algum sistema montado.

Apesar do FHS definir estes diretórios como pontos de montagem para dispositívos, qualquer
diretório pode servir como ponto de montagem.

Se os diretórios escolhidos como ponto de montagem não estiverem vazios ao montar um


dispositivo, o conteúdo não ficará disponível enquanto o dispositivo não for desmontado.

114 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Figura 10 - Linux FHS

Os comandos mount e umount são usados para montar e desmontar sistemas de arquivos.

mount
$ mount [opções] {dispositivo} {diretório}

O comando mount é utilizado para montar um dispositivo na hierarquia do sistema de


arquivos do Linux de forma manual.

Geralmente deve ser informado como parâmetro um dispositivo a ser montado e o ponto de

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 115


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

montagem.

Existe outra possibilidade de montagem manual informando somente o dispositivo, ou


somente o ponto de montagem. Quando isso acontece, o dispositivo ou o ponto de
montagem devem existir configurados no arquivo /etc/fstab:

$ mount [opções] dispositivo


$ mount [opções] diretório

O arquivo /etc/fstab contém as informações de montagem dos dispositivos que são


montados durante o processo de carga do sistema.

O mount também possibilita as seguintes notações de dispositivo sejam usadas para se


referir a um dispositivo:

Notação Descrição

/dev/sdaX Especifica o dispositivo pelo nome dele no sistema;

LABEL=<rótulo> Especifica o dispositivo pelo rótulo do sistema de arquivos;

UUID=<uuid> Especifica o dispositivo pelo UUID do sistema de arquivos;

PARTLABEL=<rótulo> Especifica o dispositivo pelo rótulo da partição;

PARTUUID=<uuid> Especifica o dispositivo pelo UUID da partição;

As opções mais frequentes são:

-a Monta todos os dispositivos especificados no arquivo /etc/fstab que não tem


a opção noauto selecionada;
-r Monta o sistema de arquivos do dispositivo como somente leitura;
-w Monta o sistema de arquivos do dispositivo para leitura e gravação;
-o Especifica as opções de montagem;
-t tipo Especifica o tipo do sistema de arquivos do dispositivo. Exemplo: ext2, ext3,
ext4, iso9660, msdos, xfs, btrfs, nfs, etc.

Para montar os diversos sistemas de arquivos, o Linux precisa estar com o suporte a estes
sistemas de arquivos habilitados no Kernel ou carregado na forma de um módulo. O arquivo
/etc/filesystems fornece uma lista dos sistemas de arquivos que estão habilitados e aceitos
pelo mount:

$ cat /etc/filesystems
xfs
ext4
ext3
ext2

116 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

nodev proc
iso9660
vfat

Exemplos de uso do mount:

Para montar um cartão USB:

# mount /dev/sdb1 /mnt

Para montar uma partição Windows (vfat) em /dev/sda1 no ponto de montagem /mnt para
somente para leitura:

# mount /dev/sda1 /mnt -r -t vfat

Para remontar a partição raíz como somente leitura:

# mount -o remount,r /

Para montar uma imagem ISO, a opção "-o loop" deve ser usada:

# mount /tmp/imagem.iso /media/iso -o loop

Para que o mount remonte todos os pontos de montagem definidos em /etc/fstab:

# mount -a

Se não for passado nenhum parâmetro ou opção, o mount mostra todos os dispositivos
montados, incluindo os pseudo-file-system /proc, /dev, /run e /sys. Ele também mostra as
opções de montagem, como leitura e gravação, bem como o sistema de arquivos:

$ mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)

devtmpfs on /dev type devtmpfs


(rw,nosuid,size=1001736k,nr_inodes=250434,mode=755)
tmpfs on /run type tmpfs (rw,nosuid,nodev,mode=755)
/dev/xvda1 on / type xfs (rw,noatime,attr2,inode64,noquota)
/dev/xvdf on /home type ext4 (rw,noatime,data=ordered)

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 117


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Para montar um dispositivo usando o UUID dele, primeiro deve-se ver qual é o UUID do
dispositivo com o comando blkid:

# blkid
/dev/sda1: UUID="1c3b15b1-cd13-4a73-b2a8-449fa3aa039f"
TYPE="xfs"
# mount UUID="1c3b15b1-cd13-4a73-b2a8-449fa3aa039f" /mnt

/etc/mtab
O sistema mantém um arquivo chamado /etc/mtab que contém as informações sobre os
dispositivos que estão montados no sistema. Ele pode conter os pontos de montagem
indicados no arquivo /etc/fstab e também os dispositivos montados manualmente.

O arquivo /etc/mtab é mantido pelo sistema, através do comando mount. O conteúdo deste
arquivo é muito similar ao arquivo /proc/mounts.

O Linux usa dois mecanismos diferentes para acompanhar os dispositivos montados. Um é


implementado no kernel e expõe esta informação ao espaço do usuário via arquivo
/proc/mounts. O outro mecanismo mantém a contabilidade dos pontos de montagem pelo
utilitário mount usando o arquivo /etc/mtab.

umount
$ umount [opções] { dispositivo | ponto de montagem }

O comando umount é utilizado para desmontar dispositivos montados pelo comando mount.

O umount sincroniza o conteúdo do disco com o conteúdo dos buffers (memória própria para
transferência de dados) e libera o diretório de montagem.

Ele tanto pode receber como parâmetro o dispositivo que está montado, quanto o diretório
do ponto de montagem:

$ umount [opções] dispositivo

Ou

$ umount [opções] diretório

As opções disponíveis são:

-a Desmonta todos os dispositivos listados no arquivo /etc/mtab, que é mantido


pelo comando mount como referência de todos os dispositivos montados;
-f Força que um dispositivo seja desmontado;

118 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

-t tipo Desmonta somente os dispositivos que contenham o sistema de arquivos


especificado no tipo.

Nenhum arquivo pode estar em uso no sistema de arquivos que será desmontado.

Exemplos:

$ umount /dev/cdrom

Ou

$ umount /media/cdrom

Nunca retire um disco removível como memórias flash, pendrivers e HDs externos sem antes
desmontar o sistema de arquivos, pois haverá grande hipótese de perda de dados.

Às vezes, quando se tenta remover um dispositivo, recebemos a mensagem de que ele está
em uso:

$ sudo umount /media/uira/UNTITLED/


umount: /media/uira/UNTITLED: o alvo está ocupado.

Neste caso, pode-se usar o comando lsof para se descobrir quais são os arquivos e usuários
que estão com arquivos em uso no dispositivo:

$ lsof /media/uira/UNTITLED/
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
evince 81294 uira 16r REG 8,50 190985 2217
/media/uira/UNTITLED/CompTIA Linux+ XK0-004 Exam Objectives_ESN.pdf
soffice.b 81592 uira 5uW REG 8,50 17095 2221
/media/uira/UNTITLED/melhorias campus bh.docx

Para desmontar esse dispositivo, existem duas opções: pedir gentilmente que o usuário
feche o que está fazendo, ou terminar de forma abrupta os processos 81294 e 81592 com o
comando "kill -9 81294 e 81592" e depois desmontar o dispositivo.

lsblk
$ lsblk [opções] [dispositivo]

O comando lsblk mostra informações de todos os dispositivos conectados no sistema.

As opções mais comuns são:

-a, --all Mostra inclusive dispositivos vazios;


-d, --nodeps Mostra informações de somente o dispositivo, sem mostrar por

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 119


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

exemplo as partições;
-f, --fs Mostra informações detalhadas sobre os sistemas de arquivos;

Exemplo de uso:

$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 64G 0 disk
├─sda1 8:1 0 1G 0 part /mnt
└─sda2 8:2 0 63G 0 part
├─cl-root 253:0 0 41G 0 lvm /
├─cl-swap 253:1 0 2G 0 lvm [SWAP]
└─cl-home 253:2 0 20G 0 lvm /home
sr0 11:0 1 1024M 0 rom

A opção -d mostra as informações, sem as partições:

$ lsblk -d
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 64G 0 disk
sr0 11:0 1 1024M 0 rom

A opção -f pode ser útil para ver o UUID dos dispositivos:

$ lsblk -f
NAME FSTYPE LABEL UUID
MOUNTPOINT
sda

├─sda1 xfs 1c3b15b1-cd13-4a73-b2a8-449fa3aa039f


/mnt
└─sda2 LVM2_member GZXwoc-7Zia-AdE3-ZFwD-SUgd-8hK3-j003qr
├─cl-root xfs 602fcf7d-d716-4f5b-aa6b-fb34d85a0169 /
├─cl-swap swap a873901e-5b33-4c78-84f5-e9eeadd9fba3
[SWAP]
└─cl-home xfs fcbdceb1-9053-460b-908c-f7913f91dbe6
/home
sr0

120 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

blkid
# blkid [opções] dispositivo

O comando blkid mostra que tipo de conteúdo um dispositivo de bloco (discos) contém e os
seus atributos como nome do dispositivo, e outras metadados.

Se um dispositivo for informado, ele irá mostrar somente as informações do determinado


dispositivo. Se nenhum parâmetro for informado, ele irá mostrar as informações de todos os
dispositivos de bloco conectados.

Exemplo:

# blkid
/dev/sda1: UUID="1c3b15b1-cd13-4a73-b2a8-449fa3aa039f"
TYPE="xfs"
/dev/sda2: UUID="GZXwoc-7Zia-AdE3-ZFwD-SUgd-8hK3-j003qr"
TYPE="LVM2_member"
/dev/mapper/cl-root: UUID="602fcf7d-d716-4f5b-aa6b-fb34d85a0169"
TYPE="xfs"
/dev/mapper/cl-swap: UUID="a873901e-5b33-4c78-84f5-e9eeadd9fba3"
TYPE="swap"
/dev/mapper/cl-home: UUID="fcbdceb1-9053-460b-908c-f7913f91dbe6"
TYPE="xfs"

Ele também mostra informações sobre a topologia do disco:

$ sudo blkid -i /dev/sda1


DEVNAME=/dev/sda1
MINIMUM_IO_SIZE=4096
PHYSICAL_SECTOR_SIZE=4096
LOGICAL_SECTOR_SIZE=512

/etc/fstab

O arquivo /etc/fstab armazena a configuração de quais dispositivos devem ser montados e


qual o ponto de montagem de cada um na carga do sistema operacional, mesmo dispositivos
locais e remotos.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 121


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

A configuração do arquivo /etc/fstab contém os seguintes campos:

Dispositivo: Especifica o dispositivo a ser montado. Pode ser nome do dispositivo em


/dev, UUID ou LABEL;
Ponto de Montagem: Especifica o diretório em que o dispositivo será montado;
Tipo de Sistema de Arquivos: Especifica o tipo de sistema de arquivos a ser
montado;
Opções de Montagem: Especifica as opções de montagem dependendo do tipo de
sistema de arquivos;
Frequência de Backup: O programa dump consulta o arquivo para saber a
frequência de Backup. É um campo numérico, onde 1 é para sistemas ext2 e 0 para
outros;
Checagem de Disco: determina se o dispositivo deve ou não ser checado na carga
do sistema pelo fsck. É um campo numérico, onde 0 é para não ser checado, 1 é para
ser checado primeiro (sistema raiz) e 2 para checar depois do sistema raiz.

Os campos podem ser separados por espaço simples, ou TAB.

Cada linha no /etc/fstab deve ser um ponto de montagem separado e deve obrigatoriamente
conter todos esses campos para que o registro no /etc/fstab esteja correto.

Os tipos de sistema de arquivos mais comuns são: ext2, ext3, ext4, reiserfs, xfs, btrfs, vfat,
iso9660, nfs, swap, etc.

As opções de montagem disponíveis são:

Opção Descrição

auto Habilita que o dispositivo seja montado na carga do sistema operacional.

noauto Desabilita que o dispositivo seja montado na carga do sistema operacional.

ro Monta o sistema de arquivos como somente leitura.

rw Monta o sistema de arquivos para leitura e gravação.

exec Habilita a execução de arquivos no sistema de arquivos especificado.

noexec Desabilita a execução de arquivos.

user Possibilita que qualquer usuário monte o dispositivo.

nouser Somente o superusuário pode montar e desmontar o dispositivo.

sync Habilita a transferência de dados síncrona no dispositivo.

async Habilita a transferência de dados assíncrona no dispositivo.

dev Dispositivo especial de caracteres.

suid Habilita que os executáveis tenham bits do suid e sgid e executem como se fosse o
superusuário.

122 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Opção Descrição

nosuid Desabilita que os executáveis tenham bits do suid e sgid.

defaults Configura as opções de montagem como rw, suid, exec, auto, nouser e async.

Exemplo de /etc/fstab:

$ cat /etc/fstab
UUID=8a9e0fcb-f415-4a3f-931d-919fadf8e22c / xfs defaults
0 1
/dev/xvdf /home ext4 defaults
0 1
/dev/xvdg swap swap defaults
0 0

Neste exemplo, o dispositivo que foi montado como raiz uma a notação UUID, tem o sistema
de arquivos xfs, com opções padrão. Um outro disco /dev/xvdf foi montado como diretório
/home do sistema, usando o ext4.

E ainda, o /etc/fstab contém informação da partição usada como swap. Neste caso o ponto de
montagem será swap, bem como o tipo também será swap. Desta forma, quando o
computador reiniciar, a partição de swap será habilitada automaticamente com o comando
"swapon".

Relembre que o comando mount com a opção -a remonta todos os dispositivos configurados
no /etc/fstab.

É comum usar o UUID dos discos no /etc/fstab de forma a evitar que o nome do disco em
/dev/ seja alterado devido alguma mudança no hardware, como por exemplo a inserção de
um novo disco.

Logical Volume Manager - LVM

O esquema de particionar que os discos que você acabou de ver é útil para dividir os dados
em uma estrutura organizacional que atenda e faça algum sentido. No entanto, uma vez
criada a partição, para fazer alterações é complicado, sem envolver uma possível perda de
dados.

Na melhor das hipóteses é possível mover os dados para início do disco e reparticiona-lo "a
quente". Na pior das hipóteses, é necessário um backup, recriar as partições e restaurar o
backup no novo layout.

Para evitar toda essa trabalheira e possível perda de dados, o pessoal resolveu criar um

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 123


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

gerenciador de volumes lógicos, chamado LVM - Logical Volume Manager.

O LVM é um Gerenciador de Discos integrado ao Kernel do Linux. Ele permite que:

Discos sejam trocados sem interrupção do serviço (hotswap);


Alterar o tamanho dos volumes;
Criar imagens (snapshots) de volumes;
Criar backup de imagens dos volumes;
Criar um volume único a partir de vários discos (similar ao RAID 0);
Criar volumes espelhados em mais de um disco (similar ao RAID 1).

Desta forma, o LVM foi criado para ampliar o sistema de arquivos que tradicionalmente é
visto como um conjunto de discos físicos e partições. Seu objetivo é permitir uma
flexibilidade grande para o administrador no gerenciamento dos discos.

Imagine que o usuário tenha o seguinte esquema de partições sem o LVM:

Ponto de Montagem Partição Tamanho

/boot /dev/sda1 500 Megabytes

Swap /dev/sda2 1 Gigabyte

/ /dev/sda3 6 Gigabytes

/home /dev/sda4 4 Gigabytes

Neste exemplo, se o usuário desejar aumentar a partição raiz, ele teria que reformatar seu
disco, ou mesmo mover parte dos dados para outro disco e montar a nova partição como um
diretório do raiz.

Ao passo que, se o usuário utilizar o LVM, ele poderia simplesmente diminuir o tamanho do
/home e aumentar o raiz, ou mesmo adicionar outro disco e aumentar o raiz, sem precisar
fazer backup dos dados, formatar a partição e copiar os dados de volta. Observe o mesmo
exemplo utilizando volumes:

Ponto de Montagem Partição Tamanho

/boot /dev/sda1 500 Megabytes

Swap /dev/vg00/swap 1 Gigabyte

/ /dev/vg00/root 6 Gigabytes

/home /dev/vg00/home 4 Gigabytes

Em grandes sistemas com muitos discos, é praticamente inviável gerenciar os discos sem o
uso do LVM.

É importante que você saiba que existem duas versões do LVM: 1 e 2. A versão 2 é suportada
pelo Kernel 2.6 e 3.x, e pelo Kernel 2.4 com aplicação de alguns patches.
124 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

As versões de Kernels 4.x e 5.x já suportam o LVM versão 2.

A única partição que não pode ser utilizada com o gerenciador de volumes é a /boot.

Terminologia do LVM
Antes de mostrar os comandos do LVM, você precisa entender a terminologia que o LVM
utiliza:

Volume Físico: É um disco ou algum hardware que se comporte como um disco (como
um storage que use RAID);
Volume Group: É uma abstração do LVM que congrega volumes lógicos e volumes
físicos em uma mesma unidade administrativa;
Volume Lógico: É o equivalente a uma partição em um sistema não-LVM.

Passo a passo para trabalhar com o LVM


Para trabalhar com o LVM, você precisa inicializar os discos para o LVM, depois criar pelo
menos um grupo de Volumes, criar pelo menos um volume lógico no grupo que acabou de
criar, formatar o volume com o sistema de arquivos desejado e por último montá-lo.

Resumidamente, é preciso fazer os seguintes passos:

1. Se for utilizar apenas uma partição de um disco, é preciso criá-la com o fdisk ou
parted e mudar o seu tipo para 8e (LVM), caso contrário, basta usar todo o disco com
o pvcreate;
2. Inicializar os volumes físicos (partições ou discos) com o comando pvcreate;
3. Criar um volume group com o comando vgcreate;
4. Ativar um volume group com o comando vgchange;
5. Criar um volume lógico com o comando lvcreate;
6. Formatar o volume lógico com o sistema de arquivos desejado com o mkfs.
7. Montar o volume lógico com o mount.

Criando partições LVM


Se você não deseja utilizar todo o disco como LVM, pode usar o fdisk para criar uma ou mais
partições tipo LVM. Para criar uma partição LVM com o fdisk, você cria a partição
normalmente e altera o tipo dela para 8e.

Para exemplificar, imaginemos que o sistema foi instalado no disco /dev/sda.

E para o LVM serão utilizados mais dois discos: /dev/sdb e /dev/sdc que não estão
particionados.

Antes de adicionar um disco ou partição como um volume físico do LVM é preciso inicializá-lo
com o comando pvcreate.

Incializando volumes físicos


Para inicializar volumes físicos de discos inteiros o comando é: pvcreate e o caminho

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 125


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

completo da partição ou disco:

# pvcreate /dev/sdb
Physical volume “/dev/sdb” successfully created
# pvcreate /dev/sdc
Physical volume “/dev/sdc” successfully created

Criando um volume group


Depois de inicializar os discos, é preciso criar um grupo de volume com os discos com o
comando vgcreate:

# vgcreate meuvolume /dev/sdb /dev/sdc


Volume group “meuvolume” successfully created

Ativando um volume group


Após criar o volume group, é necessário ativá-lo com o comando vgchange:

# vgchange -a y meuvolume
0 logical volume(s) in volume group “meuvolume” now active

Após o reboot do sistema é necessário ativar o volume group novamente. Então, faz-se
necessário incluir esse comando nos scripts de carga do sistema.

Criando volumes lógicos


O comando lvcreate cria volumes lógicos. No exemplo será criado um volume lógico de 1GB
chamado logico1 no volume meuvolume:

# lvcreate -L 1000 -n logico1 meuvolume


Logical volume “logico1” created

Como no nosso exmplo os discos /dev/sdb e /dev/sdc têm 2GB cada um, é possível criar até
4 volumes de 1GB cada, ou 1 só volume lógico de 4GB, como no exemplo abaixo:

# lvcreate -L 4000 -n logico1 meuvolume


Logical volume “logico1” created

Ativando o volume lógico


O comando lvchange ativa / desativa o volume lógico para uso:

126 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Para ATIVAR:

# lvchange -a y /dev/meuvolume/logico1

Para DESATIVAR:

# lvchange -a n /dev/meuvolume/logico1

Formatando o volume lógico


Qualquer sistema de arquivos pode ser usado para formatar o volume lógico:

# mkfs.ext4 /dev/meuvolume/logico1
mke2fs 1.41.14 (22-Dec-2010)
Filesystem label=
OS type: Linux
(…)

Depois de formatar o volume lógico, é necessário montá-lo:

# mount /dev/meuvolume/logico1 /mnt

Após esses passos o volume lógico estará pronto para uso.

Você também pode usar o LVM para aumentar ou diminuir o tamanho de um volume.

Aumentando o tamanho do volume com um disco novo


Primeiro é necessário criar o volume físico:

# pvcreate /dev/sdd

Atribuí-lo ao grupo:

# vgextend meugrupo /dev/sdd

Desmontar o volume lógico:

# umount /dev/meuvolume/logico1

Aumente o grupo de volume lógico:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 127


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

# lvextend -L +13090M /dev/meuvolume/logico1

Procurar por erro e reparação do mesmo:

# e2fsck -f /dev/meuvolume/logico1

Finalmente, redimensionamos:

# resize2fs /dev/meuvolume/logico1

Agora basta montar novamente:

# mount /dev/meuvolume/logico1 /mnt

Software RAID

O Linux suporta algumas configurações de disco utilizando Software RAID. A sigla RAID
atualmente é a designação de "Redundant Array of Independent Disks". O RAID de software
no Linux são implementados através do driver de dispositivo chamado md.

O RAID possibilita que dispositivos virtuais sejam criados a partir de dois ou mais discos
reais. Isso permite que várias unidades de disco ou partições sejam combinados num único
dispositivo virtual.

A combinação de discos no RAID podem permitir a redundância de dados, bem como o


agrupamento de discos para formar um só volume, ou os dois. Com isso, o uso do RAID
permite:

1. Ganho de desempenho: uma vez que os dados podem ser espalhados em vários
discos, permitindo a leitura de forma paralela;
2. Redundância: os dados podem ser espelhados, ou espalhados pelos discos, de forma
que a falha de um disco físico não compromete, sem a perda de dados;
3. Aumento da capacidade: O RAID permite combinar os discos de várias formas,
gerando um aumento da capacidade de armazenamento, da confiabilidade e
segurança dos dados;
4. Facilidade em recuperar dados perdidos: em caso de falha em um disco do
conjunto do RAID, os dados podem ser recuperados através de esquemas de
espelhamento, ou recuperação através da paridade matemática dos dados nos discos
remanescentes;
5. Aumento de segurança: os dados podem ser recuperados, aumentando a
confiabilidade do sistema.

128 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Existem basicamente 5 tipos de RAID:

RAID 0: É conhecido como espelhamento. É necessário pelo menos 2 discos, e os


dados são espelhados. Ele é o nível com melhor garantia contra falhas, mas consome
muito espaço em disco, uma vez que somente metade da capacidade dos discos é
aproveitada;
RAID 1: É conhecido como agrupamento. É necessário pelo menos 2 discos, e os
dados são espalhados. Ele é o nível com melhor aproveitamento de discos, uma vez
que a capacidade total do volume será a soma dos discos. Porém, este nível não há
nenhuma proteção contra falhas.
RAID 1+0 ou RAID 10: É o uso do RAID 0 e do RAID 1 em conjunto. São necessários
pelo menos 4 discos, e deve-se adicionar discos sempre em pares. Ele forma um
agrupamento com espelhamento.
RAID 5: É conhecido como agrupamento com paridade. Precisa de pelo menos 3
discos. Neste esquema os dados são espalhados, e um cálculo de paridade é feito, de
forma a garantir que a perda de um disco não afetará o sistema e não haverá perda
de dados, uma vez que os dados podem ser recuperados pela paridade.
RAID 6: é conhecido como agrupamento com paridade dupla. Precisa de N+2 discos
para garantir a dupla paridade. Neste esquema é possível "perder" até 2 discos sem
perda de dados.

Figura 11 - RAID

mdadm
A ferramenta mdadm pode ser utilizada para criar software RAID, nas configurações RAID 0,

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 129


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

RAID 1, RAID 5, RAID 6 e RAID 10.

As opções obrigatórias para se criar um RAID são:

-C : Cria um conjunto de discos em RAID;


-l : especifica o tipo de RAID. As opções são: raid0, 0, stripe, raid1, 1, mirror,
raid4, 4, raid5, 5, raid6, 6, raid10, 10;
-n : especifica o número de dispositivos que compõe o conjunto RAID;

Exemplo:

Para criar um RAID 5 com quatro discos:

# mdadm -C /dev/md0 -l 5 -n 4 /dev/sdb /dev/sdc /dev/sdd /dev/sde

Neste exemplo, o mdadm irá criar o volume /dev/md0, composto de quatro discos (sdb, sdc,
sdd e sde) com o RAID 5.

A opção -D do mdadm mostra detalhes sobre o RAID:

# mdadm -D /dev/md0
/dev/md0:
Raid Level : raid5
Array Size : 2056192 (2008.34 MiB 2105.54 MB)
Used Dev Size : 2056192 (2008.34 MiB 2105.54 MB)
Raid Devices : 4
Total Devices : 5
Preferred Minor : 0
( ... )

130 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Simulado
1.5 - Conceitos e tecnologias de
Núvem e Virtualização

Impossível falar de um ambiente computacional sem falar em virtualização e contêineres. Os


velhos CPD's nas empresas deram lugar a computação nas nuvens, com ambientes flexíveis.

O termo computação na nuvem foi descrito pela primeira vez em 1997 em documentos da
ARPAnet, que foi a rede de computadores precursora da Internet como conhecemos. Ele foi
designado para representar uma grande rede de servidores interconectadas e dispersas
geograficamente, de modo que cada ambiente é auto-suficiente e independente.

Popularizado por grandes empresas como a Amazon Web Services (AWS), Microsoft Azure e
Google Cloud Platform, o termo computação em nuvem serve atualmente para designar
computação distribuída, onde recursos computacionais são compartilhados e distribuídos
para completar uma determinada tarefa ou aplicação.

O Linux é perfeitamente adaptável a esse tipo de ambiente computacional, que parece que
foi feito para ele, em uma simbiose perfeita.

Apesar de ter acesso a hardware cada vez mais eficiente e poderoso, as operações
executadas nos servidores físicos tradicionais - ou bare-metal - inevitavelmente enfrentam
limites práticos significativos.

O custo e a complexidade da criação e do lançamento de um único servidor físico significam


que adicionar ou remover efetivamente recursos para atender rapidamente às demandas é
difícil ou, em alguns casos, impossível. Some o custo do servidor, com custo de energia e
refrigeração. Custo de link de Internet e ainda de segurança de um bom firewall.

Testar com segurança novas configurações ou aplicativos completos antes do lançamento


também pode ser complicado, caro e demorado.

Neste sentido a computação evoluiu para fornecer servidores virtuais, que podem ser criados
ou destruídos em poucos segundos, ou mesmo ter a capacidade de aumentar e diminuir
rapidamente seu poder computacional.

Isto fornece um diferencial ímpar para as aplicações corporativas, que devem atender às
necessidades de negócios em constante mudança.

A virtualização de máquinas envolve as seguintes premissas:

Acesso do software aos recursos e drivers de hardware de forma indistinguível de


uma experiência não virtualizada;
Deve permitir o controle completo do cliente sobre o hardware do sistema
virtualizado.
Permitir que os recursos físicos de computação, memória, rede e armazenamento
(“núcleo quatro”) sejam divididos entre várias entidades virtuais.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 131


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Cada dispositivo virtual é representado em seus ambientes de software e usuário


como uma entidade real e independente.
Configurados corretamente, recursos praticamente isolados podem fornecer
aplicativos mais seguros sem conectividade visível entre ambientes.
A virtualização também permite que novas máquinas virtuais sejam provisionadas e
executadas quase instantaneamente e depois destruídas assim que não forem mais
necessárias.

O tipo de adaptabilidade que a virtualização oferece ainda permite que scripts adicionem ou
removam máquinas virtuais em segundos ... em vez das semanas que demoram para
comprar, provisionar e implantar um servidor físico.

Virtualização como motor da inovação


Em essência, a virtualização aumenta a flexibilidade, dissociando um sistema operacional e
os serviços e aplicativos suportados por esse sistema a partir de uma plataforma de
hardware físico específica. Permite o estabelecimento de vários ambientes virtuais em uma
plataforma de hardware compartilhada.

As organizações que desejam inovar descobrem que a capacidade de criar novos sistemas e
serviços sem instalar hardware adicional (e derrubar rapidamente esses sistemas e serviços
quando não forem mais necessários) pode ser um impulso significativo à inovação.

Entre as abordagens possíveis estão o rápido estabelecimento de sistemas de


desenvolvimento para a criação de software personalizado, a capacidade de configurar
rapidamente ambientes de teste, a capacidade de fornecer soluções alternativas de software
e compará-las sem grandes investimentos em hardware, suporte a prototipagem rápida e
ambientes de desenvolvimento ágil, e a capacidade de estabelecer rapidamente novos
serviços de produção sob demanda.

Como a virtualização funciona


Em condições normais de ambientes não virtuais, as máquinas com arquiteturas x86
controlam estritamente quais processos podem operar em cada camadas de software.

Normalmente, apenas o kernel do sistema operacional tem chance de acessar as instruções


diretas de acesso ao hardware, e ele provê serviços para as camadas acima, como o
ambiente de trabalho e aplicações.

Desta forma, em um ambiente virtual, você não pode dar acesso direto ao hardware para
diversos sistemas operacionais de forma direta sem causar uma grande confusão.

Por isso, quando se fala em virtualização deve haver um gerente de máquina virtual (ou
"hypervisor") cuja tarefa é redirecionar efetivamente solicitações de recursos como memória
e armazenamento para os sistemas virtualizados.

Acontece que adicionar essa camada a mais de software para fornecer esse nível de
coordenação adicionará latência significativa a praticamente todos os aspectos do
desempenho do sistema.

132 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Uma solução muito bem-sucedida foi a introdução de novos conjuntos de instruções nas
CPUs que permitem que um sistema operacional convidado opere sem causar impacto em
outras operações não relacionadas. Por isso é importante que o hardware utilizado para
implementar virtualização seja adequado e contenha esse conjunto de instruções na CPU.

Tipos de Hypervisor
Tradicionalmente, existem duas classes de hipervisor: Tipo 1 e Tipo 2.

Os hipervisores de bare-metal (Tipo 1) são inicializados como sistema operacional de


uma máquina e - às vezes através de uma máquina virtual privilegiada (VM) primária -
mantêm controle total sobre o hardware do host, executando cada SO convidado como um
processo do sistema.

O XenServer e o VMWare ESXi são exemplos modernos de destaque do Tipo 1. Nos últimos
anos, o uso popular do termo "hypervisor" se espalhou para incluir todas as tecnologias de
virtualização de host.

O tipo 1 funciona mais como um "Monitor de Máquinas Virtuais".

Os hipervisores hospedados (Tipo 2) são simplesmente processos executados no topo de


uma pilha normal do sistema operacional. Os hipervisores do tipo 2 (que incluem o VirtualBox
e, de certa forma, o KVM) abstraem recursos do sistema host para sistemas operacionais
convidados, fornecendo a ilusão de um ambiente de hardware privado.

Tipos de Máquinas Virtuais: VMs x para-virtuais x


Drivers
As Máquinas virtuais (VMs) Completas (Full-VM) são totalmente virtualizadas. O
sistema operacional convidado não percebe que está em um hardware virtual, se
comportando como implantações regulares do sistema operacional com seu próprio
hardware privado.

Como eles não precisam interagir com o ambiente de maneira diferente de um sistema
operacional independente, eles podem executar com pilhas de software não modificadas
disponíveis no mercado.

O outro tipo de Máquina Virtual são as para-virtuais (PV), que estão pelo menos
parcialmente cientes de seu ambiente virtual, incluindo o fato de estarem compartilhando
recursos de hardware com outras máquinas virtuais. Isto pode significar um melhor
desempenho para as operações que exigem conectividade aos componentes de hardware.

A Para-virtualização e virtualização completa podem ser combinadas para permitir que


sistemas operacionais não modificados recebam desempenho de Entrada / Saída quase
nativo usando drivers para-virtualizados em sistemas operacionais totalmente
virtualizados.

Templates de Hypervisor
As máquinas virtuais que são criadas para executar em um Hypervisor devem ser

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 133


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

configuradas para determinar quais recursos elas precisam, e como vão interagir com o
hardware. Estas configurações podem ser salvas em modelos, que facilitam duplicar ou
mover as máquinas virtuais de hypervisor.

A indústria de software criou um padrão aberto de configuração de máquinas virtuais


chamado Open Virtualization Format (OVF). Este formato cria um pacote de distribuição
com vários arquivos, dentre os quais a configuração é salva em um arquivo no formato XML.

O OVF é um formato de arquivo que suporta a troca de dispositivos virtuais entre produtos e
plataformas. Quando você exporta uma máquina virtual como um arquivo OVF, você cria um
diretório que contém um arquivo OVF e os arquivos do disco virtual.

Para facilitar a exportação da configuração OVF, a indústria criou o Open Virtualization


Appliance (OVA) que é uma distribuição de arquivo único que contém todos os arquivos do
pacote de arquivos OVF.

O OVF e o OVA podem encapsular aplicativos de várias camadas e mais de uma máquina
virtual.

Compatibilidade de hardware
Pelo menos alguns recursos de virtualização requerem suporte de hardware - especialmente
da CPU do host. Portanto, você pode garantir que o servidor tenha suporte ao Hypervisor na
CPU.

Isto pode ser checado no arquivo /proc/cpuinfo na seção "flags" de cada processador:

$ grep hypervisor /proc/cpuinfo

flags : fpu vme de pse rdrand hypervisor lahf_lm abm pts

Outros tipos de extensão de CPU específicas de processador podem ser checadas. O flag vmx
indica virtualização presente nos processadores da Intel e o flag svm para processadores da
AMD:

$ grep -E 'svm|vmx' /proc/cpuinfo

Softwares de Virtualização Completa


Algumas implementações de virtualização completa disponíveis:

O KVM / QEMU é uma solução completa de virtualização para hardware Linux de


arquitetura x86 que contém extensões de virtualização (Intel VT ou AMD-V). Usando o
KVM, é possível executar várias máquinas virtuais executando imagens não
modificadas do Linux ou Windows. A KVM faz parte da RedHat Emerging Technologies
(ET).

134 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

O Xen é um monitor de máquina virtual que fornece serviços que permitem que
vários sistemas operacionais de computadores sejam executados simultaneamente
no mesmo hardware. O Xen é a solução de escolha para as distribuições RedHat EL
desde 2005.
O VirtualBox é uma solução completa de virtualização para hardware x86 e AMD64 /
Intel64. A Sun Microsystems iniciou esse projeto, que agora é totalmente suportado
pela Oracle. Existe um esquema de licenciamento duplo, entre os quais a GPLv2.
Alegadamente, o VirtualBox é uma das soluções de virtualização completas mais
rápidas.

Criação, Migração e Cópia (Bootstrapping)


O modelo de virtualização também permite uma ampla variedade de operações de migração,
backup e clonagem - mesmo a partir de sistemas em execução.

Como os recursos de software que definem e controlam uma máquina virtual são tão
facilmente identificados, geralmente não é necessário muito esforço para duplicar ambientes
de servidor inteiros em vários locais e para vários propósitos.

Às vezes, não é mais complicado do que criar um arquivo de um sistema de arquivos virtual
em um host, descompactá-lo no mesmo caminho em um host diferente, verificar as
configurações básicas da rede e ativá-lo. A maioria das plataformas oferece uma única
operação de linha de comando para mover convidados entre hosts.

Dependendo da implementação da máquina virtual, é preciso estar atento em alguns


detalhes ao clonar uma máquina virtual, tais como:

Mudança do D-Bus Machine ID

Cada máquina virtual possui um identificados único UUID. Às vezes é necessário gerar
manualmente uma nova identificação única para a máquina clonada através dos comandos:

# rm /var/lib/dbus/machine-id
# dbus-uuidgen --ensure

Mudança do Hostname

Pode ser necessário também alterar o nome do hostname manualmente editando o


arquivo /etc/hostname:

# vi /etc/hostname

Mudança das chaves de SSH

Ao clonar uma máquina virtual, pode ser necessário regerar as chaves de SSH manualmente:

# sudo rm /etc/ssh/ssh_host_*

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 135


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

# dpkg-reconfigure openssh-server
# sudo service ssh start
# sudo rm /etc/rc.local

Existem várias ferramentas que servem para configurar de maneira rápida e simplificada as
máquinas virtuais, através de scripts e serviços, de forma que é possível criar, clonar e
mover as máquinas virtuais de forma orquestrada.

O exame requer algum conhecimento das ferramentas Kickstart e Cloud-Init.

Gerenciamento de Máquinas Virtuais


Cloud-Init

O Cloud-Init é um pacote muito utilizado para simplificar o trabalho de automação das


instâncias de máquinas virtuais. Ele automatiza praticamente todos os procedimentos de
mudança de configurações de rede, nome do host, mudança de chaves SSH, monatgem de
discos, etc. Com ele é possível:

Definir uma localidade padrão para linguagem, mapa de teclado, etc;


Definir o nome de host da instância;
Gerar Chaves Privadas SSH da Instância;
Adicionar chaves SSH às .ssh / allowed_keys de um usuário para que ele possa fazer
login;
Configurar pontos de montagem;
Configurar dispositivos de rede

Kickstart com Anaconda

O Anaconda Cloud é um serviço de gerenciamento de pacotes da Anaconda. A nuvem facilita


a localização, o acesso, o armazenamento e o compartilhamento de notebooks públicos,
ambientes e pacotes Anaconda e PyPI.

O Anaconda Cloud facilita a atualização com as atualizações feitas nos pacotes e ambientes
que você está usando. Ela hospeda centenas de pacotes Python úteis, notebooks e
ambientes para uma grande variedade de aplicativos. Você não precisa fazer login, ou
mesmo ter uma conta, para procurar pacotes públicos, baixar e instalá-los.

Você pode criar novos pacotes usando a interface de linha de comando (CLI) do Anaconda
Client e, em seguida, carregar manualmente ou automaticamente os pacotes para o
Anaconda Cloud para compartilhar rapidamente com outras pessoas ou acessar você mesmo
de qualquer lugar.

Para desenvolvedores, o Anaconda Cloud foi projetado para facilitar o desenvolvimento, a


liberação e a manutenção de software, fornecendo amplo suporte de gerenciamento de
pacotes. Cloud permite hospedagem gratuita de pacotes públicos, bem como canais de
pacotes, fornecendo um serviço flexível e escalável para grupos e organizações de todos os
tamanhos.
136 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

Grandes Players de Cloud Computing


Os grandes provedores de computação na Nuvem que podemos destacar são:

Amazon AWS
Microsoft Azure
Google Cloud
Rackspace
IBM Cloud
VMWare
Oracle Cloud

Modelos de Computação em Nuvem


Os recursos computacionais em computação distribuída podem ser comercializados em três
modelos diferentes. Os grandes Players geralmente oferecem os três modelos, a gosto do
cliente.

Infraestrutura como Serviço (IaaS)

No modelo de Infraestrutura como Serviço, os provedores de computação em nuvem


oferecem recursos de "baixo-nível", com todos os componentes que um servidor físico é
capaz de prover, como tempo de CPU, espaço de memória, armazenamento, serviços de
rede, etc. Neste modelo, o cliente é responsável por administrar o sistema operacional, bem
como todas as aplicações que este sistema operacional vai executar.

Por exemplo, a Amazon Web Services (AWS) oferece neste modelo suas instâncias EC2, de
forma que o cliente escolhe a CPU, Memória, Armazenamento e qual sistema operacional virá
pré-instalado. Toda a manutenção do sistema operacional, bem como as aplicações são de
responsabilidade do cliente.

Neste modelo você paga pelo que utiliza, pelo tempo que utiliza. Isto permite uma grande
flexibilidade de adaptação e mudança do ambiente computacional.

Instâncias de máquina virtual

É como são chamadas as máquinas virtuais em ambientes de cloud computing. É possível


definir no momento da criação a CPU, Memória e Discos da máquina desejada, bem como
tipo e versão de sistema operacional. Alguns ambientes ainda permitem alterar o hardware
virtual da instância em funcionamento.

Este tipo de ambiente ainda permite personalizar as máquinas virtuais ao gosto do cliente,
bem como criar clones de VM's aos montes se necessário.

Instâncias e opções de armazenamento

Por padrão, cada instância tem um disco permanente de inicialização pequeno que contém o
sistema operacional.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 137


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Se precisar de mais espaço de armazenamento nos aplicativos em execução na instância,


basta adicionar outros discos. Várias opções são possíveis, desde HDs em disco,
armazenamento de backup, discos SSD e outras opções de armazenamento de alta
capacidade e baixa latência e grande redundância.

Instâncias e redes

Os ambientes virtuais em cloud computing permitem ainda a criação de redes virtuais


privadas entre as instâncias e também entre instâncias e alguma outra rede na Internet,
garantindo a privacidade e conectividade.

Instâncias e contêineres

Os players de Cloud Computing também fornecem instâncias otimizadas para criação de


contêineres Docker ou Kubernetes, com gerenciamento fácil dos contêineres.

Ferramentas para gerenciar instâncias

É possível criar e gerenciar instâncias usando várias ferramentas do Player escolhido, bem
como um conjunto de API's que permitem uma customização do ambienten computacional e
também ferramentas de linha de comando.

Plataforma como Serviço (PaaS)

No modelo de Plataforma como Serviço, existe uma pequena variação do modelo anterior, de
forma que o provedor de serviços é responsável por administrar o sistema operacional, e
mantê-lo funcionando com as atualizações, correções e segurança.

Por exemplo na AWS, os serviços de Lightsail são um exemplo de PaaS. O usuário escolhe a
capacidade computacional da instância e o tipo de aplicação que ela vai executar, como
Apache Web Server, Nginx Web Server, bem como a pilha de aplicativos que vai executar,
tais como Wordpress, Magento, Drupal, Joomla, Redmine, Plesk, Node.Js, etc.

Software como Serviço (SaaS)

No modelo Software como Serviço, o provedor fornece e é responsável por tudo, de forma
que o cliente tem acesso a aplicação, sem a necessidade de se preocupar nem com o
software que está sendo executado. Esse é o modelo vendido por diversas empresas, que
prestam algum serviço, através de suas aplicações.

Por exemplo na AWS, temos o RDS (Relational Database Service), que provê serviços de
banco de dados relacionais como MySQL, Aurora, PostgreSQL, MariaDB, Oracle Database e
SQL Server. O cliente não precisa se preocupar com o sistema operacional, nem mesmo com
a administração do banco de dados. Ele simplesmente acessa o banco.

138 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Figura 12 - Modelos de CloudComputing

Armazenamento em Máquinas Virtuais

O armazenamento em máquinas virtuais é feito em discos virtuais, que são na realidade um


ou mais arquivos no disco do sistema operacional hospedeiro. Existem várias configurações
possíveis de armazenamento em se tratando de máquinas virtuais, a saber:

Provisionado Estático (thick): quando uma máquina virtual é criada, é possível


definir uma certa quantidade de disco. Esta quandidade alocada cria
automaticamente um arquivo físico no sistema operacional hospedeiro com o mesmo
tamanho da quantidade solicitada. Por exemplo, um disco virtual de 500 Mb, irá criar
um arquivo de 500 Mb no disco do sistema operacional hospedeiro.
Provisionado Dinâmica (thin): quando uma máquina virtual é criada com este
modelo, é possível definir uma certa quantidade de disco, mas o arquivo físico no
sistema operacional hospedeiro cresce de acordo com o uso do disco. Por exemplo, é
possível provisionar um disco de 500 Mb, mas se utilizar somente 50 Mb, o arquivo
físico terá apenas 50 Mb.
Volume Persistente: este conceito é quando um volume de uma máquina virtual
permanece, mesmo depois que uma máquina virtual é destruida.
Blob: o armazenamento em blob é um termo usado no Microsoft Azure, que consiste
em dados não estruturados que podem ser manipulados por códigos .NET.
Geralmente armazenam imagens, vídeos, áudios, etc.

Rede em Máquinas Virtuais

Os hypervisors podem criar uma ou várias interfaces de rede virtuais, switches de rede,
incorporar firewalls, load balancing e até roteadores.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 139


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Geralmente o software de hypervisor incorpora um Switch Virtual, no quais as "placas de


rede virtuais" são conectadas. E o switch virtual do Hypervisor por sua vez é conectado à
placa de rede física do host.

Varios conceitos podem ser aplicados em configuração de rede de máquinas virtuais, a


saber:

VLAN: Este conceito vem de Virtual Local Area Network. Uma LAN é um conjunto de
hosts em ligados em uma rede local, com conexões físicas (cabos, fibras ou Wifi),
circunscrita em uma área física determinada, como um departamento, uma empresa
ou mesmo um prédio ou conjunto de prédios. Uma VLAN consistem de várias LANs,
geralmente dispersas geograficamente, que podem ser interligadas através de
conexões virtuais.
Redes de Sobreposição (overlay): este termo define uma conexão virtual que
consiste em encampsular os pacotes em canais diferentes, de forma que cada canal é
designado para um serviço ou dispositivo. Este tipo de configuração permite criar
ambientes de rede em software, de forma flexível e escalável.
Local (host-only): Um adaptador de rede local conecta a rede da máquina virtual ao
switch virtual do hypervisor. Neste modelo não há conexão com uma rede externa.
Seu propósito é a conexão em rede entre duas ou mais máquinas virtuais do mesmo
systema operacional hospedeiro. Este adaptador virtual funciona atrvés de cópia de
dados em memória, e, portanto, é extramemente rápido.
Ponte (bridge): Neste modelo as máquinas virtuais funcionam como se estivessem
com seu adaptador de rede conectado a LAN local. Elas possuem seu próprio
endereço IP, podem ser vistas na rede e transmitem e recebem seu próprio tráfego,
como se fosse uma máquina comum conectada fisicamente a rede local.
NAT (Network Address Translation): Neste modelo, o hypervisor cria uma rede
local virtual própria, de forma que as máquinas virtuais ganham um IP da rede
privada virtual, e toda a comunicação é feita através da tradução dos endereços IPs
privados da rede virtual do hypervisor e o IP da rede física do Hypervisor.
Dual-Homed: Este modelo é muito comum em ambientes virtualizados, pois habilita
duas placas de rede virtuais, uma utilizando o modelo de Ponte, de forma que serve
para se comunicar com hosts externos, e outra placa de rede com a configuração
Local (Host-Only), para comunicar com o hypervisor ou outras máquinas virtuais no
mesmo hospedeiro. Com isso é possível conseguir a comunicação externa
transparente, e a comunicação interna extremamente rápida.

Virtualização em Contêineres

Como vimos, uma VM é um sistema operacional completo cuja relação com os recursos de
hardware do núcleo quatro é totalmente virtualizada: ela pensa que está sendo executada
em seu próprio computador.

Um hipervisor instala uma VM a partir da mesma imagem ISO que você baixaria e usaria para
instalar um sistema operacional diretamente em um disco rígido físico vazio.

140 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Um contêiner, por outro lado, é, efetivamente, um aplicativo, lançado a partir de um modelo


semelhante a script, que considera um sistema operacional.

Nas tecnologias de contêiner (como LXC e Docker), os contêineres nada mais são do que
abstrações de software e recursos (arquivos, processos, usuários) que dependem do kernel
do host e uma representação dos "quatro principais" recursos de hardware (por exemplo,
CPU, RAM, rede e armazenamento).

Um contêiner então é um conjunto de um ou mais processos organizados isoladamente do


sistema, com sua própria abstração de disco, rede e bibliotecas compartilhadas. Ele tem
todos os arquivos necessários à execução dos processos para qual foi criado. No entanto, os
contêineres utilizam o Kernel do Host das instâncias em que rodam.

Na prática, os contêiner são portáteis e consistentes durante toda a migração entre os


ambientes de desenvolvimento, teste e produção. Essas características os tornam uma opção
muito mais rápida do que os modelos tradicionais de desenvolvimento, que dependem da
replicação dos ambientes de teste tradicionais.

Como os contêineres são, efetivamente, extensões isoladas do kernel do host, eles permitem
oportunidades de computação incrivelmente leves e versáteis.

DevOps e Contêineres
Os contêineres são o casamento perfeito entre desenvolvimento de software e a
infraestrutura.

Os contêineres permitem replicar um ambiente de produção em desenvolvimento com muita


facilidade, e vice-versa. Todo o ambiente criado para o desenvolvimento de uma aplicação
pode ser migrado em segundos para produção com o mínimo de esforço. Todas as
configurações, bibliotecas, dependências, arquivos, localização vão junto com a aplicação
encapsulada no contêiner com o máximo de portabilidade, configurabilidade e isolamento.

Contêiner são VM's?


Não exatamente. As duas tecnologias são complementares. Com a virtualização, é possível
executar sistemas operacionais (Windows ou Linux) simultaneamente num único sistema de
hardware.

Já os contêineres compartilham o mesmo kernel do sistema operacional host e isolam os


processos da aplicação do restante do sistema. Isto provê isolamento da aplicação sem a
necessidade de se instalar uma máquina virtual completa. Desta forma, as "instâncias de
contêiner" podem ser inicializadas, paradas e reiniciadas com maior rapidez do que uma VM
tradicional

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 141


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Figura 13 - Contêner x VMs

Podemos fazer uma abstração das máquinas virtuais como um condomínio com várias casas.
Cada casa precisa ter o seu muro, jardim, sistema de esgoto, aquecimento, telhado,
etc. Dificilmente as casas terão em comum a sua arquitetura, número de quartos, tamanho e
configurações. No condomínio as casas só compartilham o sistema de ruas, segurança e
alguma infraestrutura, mas, em contrapartida são bem independentes.

Já os contêineres são como apartamentos de um prédio. Cada família mora num apartamento
diferente, com a sua cor de parede, com os seus móveis e eletrodomésticos, mas
compartilham as áreas em comuns como hall de entrada, elevadores, espaço gourmet, rede
de esgoto, água e gás.

Software para Conteineres

LXC
O pacote LXC serve para criar contêineres, um pouco mais pesados do que um contêiner de
aplicação, mas bem mais leve do que uma máquina virtual. Ele contém o seu próprio sistema
operacional simples, que faz interface direta com o sistema operacional hospedeiro.

Por conter o seu próprio sistema operacional, algumas vezes o LXC pode ser confundido com
uma máquina virtual, no entanto, ele ainda necessita do sistema operacional hospedeiro para
funcionar.

Docker
O pacote do Docker também serve para criar contêineres. Desenvolvido pelo Docker, ele
possui uma versão enterprise e outra Community. Extremamente leve, ele permite que
diversos contêineres executem em um mesmo sistema operacional hospedeiro.

O Docker necessita executar um serviço no sistema operacional hospedeiro que gerencia as


142 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

imagens de Docker instaladas. Ele oferece tanto um cliente em modo texto para criar e
gerenciar as imagens, quanto um cliente de interface gráfica.

As configurações de criação de contêineres no Docker são gravadas em um arquivo no


formato YAML.

Ferramentas de VM

Existem várias ferramentas de código aberto para criar, apagar, reiniciar, desligar e
configurar máquinas virtuais. O exame CompTIA Linux+ trata das ferramentas: libvirt, virsh e
vmm.

Libvirt
As ferramentas do pacote Libvirt contém vários elementos:

Uma API de programação incorporada em diversos hypervisors, como o KVM;


Um serviço chamado libvirtd que é executado no sistema operacional hospedeiro,
responsável por executar as tarefas de gerenciamento das máquinas virtuais;
Ferramentas de linha-de-comando, como virt-install e virsh, utilizadas para
controlar e gerenciar as máquinas virtuais.

Virsh
O utilitário de linha de comando virsh pode ser usado para criar, remover, iniciar, parar e
gerenciar máquinas virtuais. Esta ferramenta abre um shell próprio, com diversos comandos
para controle e gerenciamento das máquinas virtuais.

VMM
O Virtual Machine Manager (VMM) é uma aplicação desktop para criar e gerenciar máquinas
virtuais. Ela pode ser executada diretamente do shell com o comando virt-manager.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 143


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Simulado
1.6 – Configurar as Opções de
Localização

Configurando as Zonas de Fuso Horário


As informações de fuso horário são geralmente requeridas durante a instalação do Linux
quando o ambiente é o Desktop. Raramente o usuário troca essas informações depois.

Mas o conhecimento de como fazer isso é necessário, uma vez que no ambiente de cloud-
computing é muito comum ser necessário a alteração de zonas de fuso horários de
servidores virtuais.

/usr/share/zoneinfo

O diretório /usr/share/zoneinfo contém as informações de configuração das zonas de fuso


horário. A zona local do sistema é determinada por um link simbólico de algum arquivo
deste diretório para o arquivo /etc/localtime.

É comum no diretório /usr/share/zoneinfo encontrarmos subdiretórios com macro regiões do


mundo ou países com vários fusos horários.

$ ls -l /usr/share/zoneinfo/
drwxr-xr-x. 2 root root 4096 Aug 20 2018 Africa
drwxr-xr-x. 6 root root 8192 Aug 20 2018 America
drwxr-xr-x. 2 root root 187 Aug 20 2018 Antarctica
drwxr-xr-x. 2 root root 26 Aug 20 2018 Arctic
drwxr-xr-x. 2 root root 4096 Aug 20 2018 Asia
drwxr-xr-x. 2 root root 196 Aug 20 2018 Atlantic
drwxr-xr-x. 2 root root 4096 Aug 20 2018 Australia
drwxr-xr-x. 2 root root 59 Aug 20 2018 Brazil
drwxr-xr-x. 2 root root 136 Aug 20 2018 Canada
( ... )

E dentro de cada diretório há os arquivos de configuração de zona de fuso horário:

$ ls -l /usr/share/zoneinfo/Brazil/
-rw-r--r--. 3 root root 634 May 9 2018 Acre
-rw-r--r--. 2 root root 714 May 9 2018 DeNoronha
-rw-r--r--. 2 root root 2002 May 9 2018 East
-rw-r--r--. 2 root root 602 May 9 2018 West

144 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

/etc/localtime

Em sistemas baseados em Red Hat (Red Hat, CentOS, Fedora, etc), para alterar uma zona de
fuso horário, deve-se excluir o link simbólico /etc/localtime existente, e criar um novo link
com o arquivo de zona de fuso horário desejado:

# rm -f /etc/localtime
# ln -s /usr/share/zoneinfo/America/Sao_Paulo /etc/localtime

Ou de maneira mais simples, usar a opção "-sf" do comando ln que apaga o link simbólico
anterior ao criar o novo:

# ln -sf /usr/shave/zoneinfo/America/Sao_Paulo /etc/localtime

Neste exemplo, a zona de fuso horário de São Paulo será utilizada pelo sistema.

Uma vez alterada a zona, o relógio ajusta-se automaticamente ao novo horário.

/etc/timezone

Em distribuições baseadas em Debian (Debian, Linux Mint, Ubuntu, etc), a configuração de


zona de fuso horário é controlada por meio do arquivo /etc/timezone, que contém a
informação de qual é a timezone. Veja o exemplo:

$ cat /etc/timezone
America/Los_Angeles

O texto a ser colocado no arquivo /etc/timezone deve coincidir com nome da zona contida no
diretório /usr/share/zoneinfo/:

# echo "America/Sao_Paulo" > /etc/timezone

Depois de alterar o conteúdo do arquivo /etc/timezone, é necessário reconfigurar o pacote


tzdata:

# dpkg-reconfigure -f noninteractive tzdata

Variável TZ

A variável TZ também pode ser utilizada para definir a zona de fuso horário do usuário

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 145


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

logado e funciona para qualquer Linux.

Se esta variável não estiver configurada, as informações do /etc/localtime ou /etc/timezone


serão utilizadas.

Esta variável é útil para configurar informações de Zona de Fuso Horário por usuário. O
sistema pode ter um fuso horário, e cada usuário conectado pode ter a sua zona quando
logado. Isto pode ser útil num ambiente servidor com usuários espalhados por diversas zonas
de fuso.

Veja o exemplo:

$ TZ='America/Miami'; export TZ

$ date
Sat 19 Oct 2019 02:37:07 PM America

$ TZ='America/Sao_Paulo'; export TZ

$ date
Sat 19 Oct 2019 11:38:01 AM -03

Como toda variável de ambiente, para funcionar para os programas executados no shell, ela
deve ser exportada com o comando "export".

Além disso, para que a configuração de timezone através da variável TZ fique permanente,
deve ser configurada em algum arquivo de inicialização do usuário, de preferência no
arquivo ~/.profile.

tzselect
$ tzselect

O utilitário tzselect pode ser utilizado para escolher a zona de fuso horário e mostral qual é o
valor correto para a variável TZ.

Seu funcionamento é simples: primeiro deve-se escolher o continente:

# tzselect
Please identify a location so that time zone rules can be set
correctly.
Please select a continent, ocean, "coord", or "TZ".
1) Africa 7) Europe

146 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

2) Americas 8) Indian Ocean


3) Antarctica 9) Pacific Ocean
4) Asia 10) geographical coordinates
5) Atlantic Ocean 11) TZ
6) Australia

Depois deve-se escolher o país:

Please select a country whose clocks agree with yours.


1) Anguilla 12) Cayman Islands
2) Antigua 13) Chile
3) Argentina 14) Colombia
4) Aruba 15) Costa Rica
5) Bahamas 16) Cuba
6) Barbados 17) Curaçao
7) Belize 18) Dominica
8) Bolivia 19) Dominican Republic
9) Brazil 20) Ecuador
( ... )

E por fim a Zona de Fuso horário:

Please select one of the following timezones.


1) Atlantic islands
2) Pará (east); Amapá
3) Brazil (northeast: MA, PI, CE, RN, PB)
4) Pernambuco
5) Tocantins
6) Alagoas, Sergipe
7) Bahia
8) Brazil (southeast)
( ... )

Uma vez selecionada a Zona de Fuso Horário desejada, o tzselect pede para confirmar as
configurações:

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: Sat Oct 19 11:56:56 -03 2019.
Universal Time is now: Sat Oct 19 14:56:56 UTC 2019.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 147


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Is the above information OK?


1) Yes
2) No

E então ele cria a linha de comando para a configuração da variável TZ e ainda indica onde
deve ser salva:

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.

date
$ date [opções] [MMDDhhmm[[CC]YY][.ss]]

O comando date pode ser utilizado para mostrar a data ou configurar a data do sistema.

As opções mais comuns são:

-d string Mostra as horas em uma determinado formato


-u Mostra ou configura as horas no formato UTC (Coordinated Universal
Time)
-s Configura as horas

O Tempo Universal Coordenado, abreviadamente UTC (do inglês Coordinated Universal


Time), também conhecido como tempo civil, é o fuso horário de referência a partir do qual se
calculam todas as outras zonas horárias do mundo.

Veja os exemplos:

$ date
Sat 19 Oct 2019 01:13:02 PM -03

A opção "-u" mostra as horas no formato UTC:

$ date -u
Sat 19 Oct 2019 04:13:45 PM UTC

O comando date permite exibir uma data em diversos formatos:

148 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

%D: mm/dd/yy.
%d: Dia do mês (01 a 31).
%a: Dias da semana abreviado (Sun, Mon ... Sat).
%A: Dias da semana por extenso (Sunday, Monday...Saturday).
%h ou %b: Mês abreviado (Jan, Feb... Dec).
%B: Mês por extenso (January... December).
%m: Mês em numeral (01 to 12).
%y: Dois últimos dois digitos do ano (00 a 99).
%Y: Ano com quatro dígitos (2019).
%T: Hora no formato 24 horas HH:MM:SS.
%H: Hora.
%M: Minuto.
%S: Segundo.
%j: Dia do ano (122)
%u: dia da semana (1... 7) - 7 representa domingo.
%w: dia da semana (0... 6) - 0 representa domingo.
%F: Formato ANO-MES-DIA

Exemplos:

$ date +'Hoje é %A, %d de %B de %Y, o %j dia do ano, as %H:%M'


Hoje é Saturday, 02 de November de 2019, o 292 dia do ano, as
14:14

Este exemplo ficou estranho, porque mostra a data com localização em inglês com uma frase
em portugueês.

Para alterar a localização e exibir tudo em português, podemos alterar a variável LC_ALL:

$ export LC_ALL=pt_BR.UTF-8

Ao executar novamente o comando date, a data ficará em português:

$ date +'Hoje é %A, %d de %B de %Y, o %j dia do ano, as %H:%M'


Hoje é sábado, 02 de Novembro de 2019, o 292 dia do ano, as 14:15

Alterar o formato da data pode ser útil para ser utilizado numa variável para ser usada em
um script:

#!/bin/bash
echo "backup dos dados"
export DATA=$(date +'%F-%H%M%S')

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 149


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

tar cvzf /home/uira/backup-$DATA.tar.gz /etc

O script acima escreve a data no formato AAAA-MM-DD-HHMMSS na variável DATA. Depois


utiliza a variável como parte do nome de um arquivo tar que faz backup do diretório /etc. O
resultado da execução será um arquivo backup-2019-10-19-142339.tar.gz.

Observe que o resultado de um comando pode ser utilizado numa variável se ele estiver
contido em $( comando ).

O comando date também pode ser utilizado para alterar a data do relógio do sistema. Neste
exemplo, mudei a data do sistema para o dia do meu aniversário:

# date +%Y%m%d -s "2019-05-11"


20190511

$ date
sáb mai 11 00:00:01 -03 2019

A variável TZ altera a data e hora mostrados pelo comando date para a zona de fuso horário.

hwclock
# hwclock [opções]

O comando hwclock pode ser usado para ler o relógio de máquina ou atualizar o relógio de
máquina com o relógio do sistema e vice-versa.

Como dito no início do capítulo, os computadores mantêm dois relógios. Um chamado de


relógio de máquina (hardware), é ligado quando o sistema está inativo, e é mantido por um
cristal de quartzo e uma bateria quando o computador está desligado. Esta bateria é capaz
de manter o relógio mesmo quando desligado da rede elétrica por um bom tempo.

Quando o computador é ligado, o Linux lê o relógio de máquina para atualizar o seu relógio
de sistema. É comum existir uma pequena diferença entre estes dois relógios.

O comando hwclock tem as seguintes opções:

-r: informa as horas do relógio do hardware com o fuso horário local;

-s: configura o relógio do sistema com as horas do relógio do hardware;

-w: configura o relógio do hardware com as horas do relógio do sistema;

-c: compara as horas do relógio de hardware e do relógio do sistema de 10 em 10


segundos;

--adjust: adiciona ou subtrai tempo do relógio do hardware para ajusta-lo ao


150 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

escorregamento da frequência;

Exemplos:

# hwclock -c
hw-time system-time freq-offset-ppm tick
1571594417 1571594417.011423
1571594427 1571594427.012649 123 1

Para ajustar o relógio do Hardware com o relógio do sistema:

# hwclock -w

timedatectl
$ timedatectl

O gerenciador de serviços Systemd também tem serviço de configuração da Zona de Fuso


Horário.

Quando executado sem nenhum parâmetro, ele mostra as configurações de Time Zone:

# timedatectl
Local time: Sat 2019-10-19 12:07:48 -03
Universal time: Sat 2019-10-19 15:07:48 UTC
RTC time: Sat 2019-10-19 15:07:48
Time zone: America/Sao_Paulo (-03, -0300)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no

Ele também pode ser utilizado para listar as timezones disponíveis:

# timedatectl list-timezones | grep America


America/Adak
America/Anchorage
America/Anguilla
America/Antigua
(...)

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 151


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Para alterar a Zona de Fuso Horário utilizando o timezonectl, basta utilizar a opção "set-
timezone" seguido do nome da zona desejada:

# timedatectl set-timezone America/Buenos_Aires

E depois reiniciar o serviço de timezone do Systemd:

# systemctl restart systemd-timedated

Feito isso, a data e hora do sistema serão alterados:

# timedatectl
Local time: Sat 2019-10-19 12:13:15 -03
Universal time: Sat 2019-10-19 15:13:15 UTC
RTC time: Sat 2019-10-19 15:13:15
Time zone: America/Buenos_Aires (-03, -0300)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no

Variáveis de Localização

O Linux mantém uma lista de variáveis ambientais para definir os padrões de


internacionalização de linguagem, formato dos números, formato das horas, formato de data,
formato de moeda, dentre outros.

As variáveis são:

LC_COLLATE: define caráter ou informações de agrupamento string;


LC_CTYPE: define o tipo de codificação de caracteres;
LC_MONETARY: define como os números são escritos, se usam ponto ou vírgula para
separar as casas;
LC_MESSAGES: define o formato de respostas afirmativas e negativas;
LC_NUMERIC: define uma lista de regras e símbolos para a formatação de
informações não-numérico monetária;
LC_TIME: define como as horas são escritas;
LC_ALL: define um padrão que tem as demais definições acima.

152 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

locale
O comando locale informa estas variáveis ambientais.

$ locale
LANG=pt_BR.UTF-8
LANGUAGE=
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=pt_BR.UTF-8

A variável LC_ALL pode ser utilizada para configurar todas as demais.

A opção “–a” fornece a lista de localizações possíveis:

$ locale -a
en_US.utf8
pt_BR.utf8

Nem sempre a localização pretendida pode estar disponível no sistema. Se ela não aparecer
com a opção "-a" do comando locale, é necessário gerar a localização.

Para ver a lista de todas as localizações que podem ser geradas, verifica-se o conteúdo do
arquivo /etc/locale.gen:

$ cat /etc/locale.gen
# aa_DJ ISO-8859-1
# aa_DJ.UTF-8 UTF-8
# aa_ER UTF-8
( ... )

Para gerar a localização pretendida e conseguir usar na variável LC_ALL, usa-se o comando
locale-gen para gerar a localização:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 153


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

$ locale-gen pt_BR.UTF-8
Generating locales (this might take a while)...
pt_BR.UTF-8... done
Generation complete.

Para alterar a configuração de localização, basta alterar a variável LC_ALL:

$ export LC_ALL=pt_BR.UTF-8

Como a localização é configurada por variáveis de ambiente, elas precisam estar no script de
carga do shell ou no profile para que fiquem permanentes no sistema.

localectl
O serviço localectl do systemd pode ser usado para consultar e alterar a localidade do
sistema e as configurações de layout do teclado.

Este serviço pode ser usado para controlar as configurações de idioma dos serviços do
sistema e da interface do usuário antes que o usuário faça login.

Exemplo:

Para visualizar a localização configurada:

$ localectl status
System Locale: LANG=en_US.UTF-8
VC Keymap: n/a
X11 Layout: n/a

Para alterar a localização:

$ sudo localectl set-locale LC_TIME=en_IN.UTF-8

154 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Padrões de Caractere

Como todo sistema operacional, o Linux precisa trabalhar com vários mapas de caracteres,
de forma a cobrir várias línguas e formatos de caracteres.

Para fazer isso, convencionou-se o uso de "Mapas de Caracteres", que mapeiam um caracter
de um determinado alfabeto em uma sequência de bits, que vão compor esses caracteres.

Esses mapas de caracteres são uma convenção utilizada em todo o mundo por diversos
sistemas computacionais, e por isso, foram rotulados com nomes e números, para que a
conversão dos bits dos arquivos seja possível, na linguagem e caracteres corretos. Isto
também possibilita a conversão dos caracteres de um mapa para outro, às vezes com certa
perda de dados.

Segue uma breve descrição dos mapas de caracteres cobrados no exame.

ASCII
ASCII é um acrônimo para American Standard Code for Information Interchange, que em
português significa “Código Padrão Americano para o Intercâmbio de Informação”. Este
padrão é uma codificação de caracteres de sete bits baseada no alfabeto inglês.

Os códigos ASCII representam texto em computadores, equipamentos de comunicação, entre


outros dispositivos que trabalham com texto. O ASCII foi desenvolvido para uso de telégrafos
em 1960 que usavam impressoras de 7-bits. Grande parte das codificações de caracteres
modernas a herdou como base.

A codificação define 128 caracteres, preenchendo completamente os sete bits disponíveis.


Desses, 33 não são imprimíveis, como caracteres de controle atualmente obsoletos, que
afetam o processamento do texto. Exceto pelo caractere de espaço, o restante é composto
por caracteres imprimíveis.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 155


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Figura 14 - Tabela ASCII

ISO-8859
A maioria dos 95 caracteres imprimíveis do ASCII são suficientes para troca de informações
quando se trata de dados escritos em inglês. No entanto, outras línguas latinas e erientais
precisam de símbolos para representar os caracteres que não são cobertos pelo ASCII, como
as letras acentuadas e outros caracteres.

O padrão ISO-8859 resolveu este problema utilizando uma codificação de 8-bits,


possibilitando mais 128 codificações além das 128 existentes no ASCII.

Mesmo com mais 128 símbolos, o ISO-8859 não comportava todos os caracteres especiais
que o alemão, espanhol, português, sueco, húngaro, dentre outras línguas necessitavam.
Desta forma, eles criaram diferentes mapas de caracteres que fazem parte do ISO-8859, a
seguir:

ISO-8859-1 – Latin-1: Caracteres latinos do oeste europeu. É o mais usado, pois cobre
156 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

o inglês, alemão, francês, italiano, português, espanhol e outras línguas da região


oeste da Europa;
ISO-8859-2 – Latin-2: Caracteres da Europa central e leste, como polaco, esloveno,
sérvio, húngaro etc.;
ISO-8859-3 – Latin-3: Caracteres do sul da Europa, como turco, e também o
esperanto;
ISO-8859-4 – Latin-4: Caracteres do Norte da Europa, como estoniano, lituano, dentre
outras;
ISO-8859-5 – Latin/Cyrillic: Caracteres usados na Rússia e na Ucrânia;
ISO-8859-6 – Latin/Arabic: Caracteres árabes;
ISO-8859-7 – Latin/Greek: Caracteres gregos;
ISO-8859-8 – Latin/Hebrew: Caracteres hebreus;
ISO-8859-9 – Latin-5: Caracteres turcos;
ISO-8859-10 – Latin-6: Usados em línguas bálticas;
ISO-8859-11 – Latin/Thai: Usados em línguas bálticas;
ISO-8859-12 – Latin/Devanagari: Usados em devanágari;
ISO-8859-13 – Latin-7: Adicionou alguns caracteres que ficaram faltando no latin-4 e
latin-6;
ISO-8859-14 – Latin-8: Caracteres celtas;
ISO-8859-15 – Latin-9: Revisão do latin 1, removendo alguns símbolos pouco usados e
adicionando outros;
ISO-8859-16 – Latin-10: Usados no sudeste europeu para albanês, croata, húngaro,
italiano, polonês, romeno e esloveno, mas também finlandês, francês, alemão e
irlandês gaélico (nova ortografia). O foco está mais em letras de símbolos. O sinal de
moeda é substituído com o símbolo do euro.

UNICODE
Unicode é um padrão que permite aos computadores representar e manipular, de forma
consistente, texto de qualquer sistema de escrita existente.

O padrão consiste de um repertório de cerca de cem mil caracteres, um conjunto de


diagramas de códigos para referência visual, uma metodologia para codificação e um
conjunto de codificações padrões de caracteres, uma enumeração de propriedades de
caracteres como caixa alta e caixa baixa, um conjunto de arquivos de computador com
dados de referência, além de regras para normalização, decomposição, ordenação alfabética
e renderização.

O Unicode é composto de esquemas padronizados de transformação Unicode chamados


Unicode Transformation Format, ou UTF.

O seu sucesso em unificar conjuntos de caracteres levou a um uso amplo e predominante na


internacionalização e localização de programas de computador. O padrão foi implementado
em várias tecnologias recentes, incluindo XML, Java e sistemas operacionais modernos.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 157


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

O Unicode possui o objetivo explícito de transcender as limitações de codificações de


caractere tradicionais, como as definidas pelo padrão ISO 8859, que possuem grande uso em
vários países, mas que permanecem em sua maioria incompatíveis umas com as outras.

O UTF-8 (8-bit Unicode Transformation Format) é um tipo de codificação Unicode de


comprimento variável criado por Ken Thompson e Rob Pike.

Pode representar qualquer caractere universal padrão do Unicode, sendo também compatível
com o ASCII. Por esta razão, é adotado como tipo de codificação padrão universal para email,
páginas web e outros locais.

O “Internet Engineering Task Force” (IETF) requer que todos os protocolos utilizados na
Internet suportem, pelo menos, o UTF-8.

Nunca tenha certeza de nada, por que a sabedoria começa com a


dúvida
-- Freud

158 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Operação e Manutenção de
Sistemas

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 159


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

160 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Olho por olho,


e o mundo acabará cego.
-- Mahatma Gandhi

Simulado
2.1 Fazer as instalações,
configurações, atualizações e
remoções de software

Este tópico aborda a instalação, manutenção e atualização de software no Linux, através de


arquivos com código fonte, ou através dos gerenciadores de pacotes de software.

Compiladores

Nos primórdios da computação, os programadores precisavam escrever os programas em


códigos e instruções ininteligíveis para o ser humano. Era um pouco melhor do que escrever
sequências de zeros e uns.

Logo ficou claro que escrever programas desta forma, e depura-los era um trabalho para
poucos. Desta forma, criaram-se algumas linguagens para escrever programas em alto nível,
como se fossem frases em inglês, que juntas faziam sentido para quem as escrevesse, e que
podiam ser transformadas em linguagem de máquinas. Para que essa transformação
funcionasse, criaram-se programas especiais chamados de compiladores.

Um compilador é um programa especial que processa instruções escritas numa linguagem de


programação particular e a transforma em código de máquina. Geralmente, um programador
escreve instruções numa linguagem de alto nível como C, C++, C#, Delphi, Cobol, Java, etc,
usando um editor de textos.

O arquivo que é criado contém o que chamamos de código fonte do programa. O


programador então executa o compilador da linguagem apropriada, especificando o nome do
arquivo que contém o código fonte.

E quando esse código fonte é distribuído junto com o software, permitindo que o usuário
possa modificá-lo, a isso da-se o nome de código livre ou código aberto.

Durante o processo de compilação, o compilador primeiro analisa todas as instruções da


linguagem sintaticamente uma após a outra e então, em um ou mais estágios sucessivos,
constrói o código de saída. Tradicionalmente, a saída da compilação é chamada de código
objeto ou algumas vezes de módulo objeto. O código objeto é o código de máquina que o
processador pode executar.

Tradicionalmente em alguns sistemas e linguagens, um passo adicional é necessário após a


compilação. Este passo é destinado a resolver o local relativo de instruções e dados quando

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 161


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

mais de um módulo objeto são unidos e são feitas referências cruzadas de um para o outro.
Este processo é conhecido como ligação.

É neste estágio que o compilador une o código objeto das bibliotecas com o código objeto do
programa. Essa união pode ser dinâmica, através de referências, ou estática, quando se
cópia o código objeto da biblioteca para o código objeto do programa.

GCC
O compilador mais utilizado no Linux é a Coleção de Compiladores GNU - GCC. Ele compila
códigos C ANSI, bem como C++, Java e Fortran. O GCC suporta vários níveis de checagem de
erros nos códigos-fonte, produz informações de debug (para depurar o código) e pode ainda
otimizar o arquivo objeto produzido.

A compilação envolve até quatro estágios: pré-processamento, compilação propriamente


dita, assembly e ligação, sempre nesta ordem.

O GCC é capaz de pré-processar e compilar vários arquivos em um ou mais arquivos em


assembler. O arquivo de assembler gera um ou mais arquivos chamados de objeto e estes
são ligados às bibliotecas (linking) para tornarem um arquivo executável.

Veja o exemplo de um código fonte de um programa Hello Word escrito em C:

#include <stdio.h>
int main( ){
printf("Ola mundo.");
}

A primeira linha do programa refere-se a uma biblioteca chamada stdio, que contém funções
de entrada e saída de dados. É muito comum cada linguagem possuir uma extensa biblioteca
de programação com centenas de funções que podem ser aproveitadas pelos
programadores, de forma que ele não precise reinventar a roda.

PRÉ-PROCESSAMENTO

O pré-processamento é responsável por expandir as macros e incluir os arquivos de


cabeçalho no arquivo fonte. O resultado é um arquivo que contém o código fonte expandido.

O comando "gcc -E" faz com que o compilador apenas pré-processe o código fonte, gerando
um código fonte expandido:

$ gcc -E hello.c | wc
798 2109 17134

Para se ter ideia, o pequeno programa hello.c, gerou um arquivo pré-processado de 798
linhas.

162 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

COMPILAÇÃO

O próximo estágio chamado de “compilação propriamente dita” é responsável por traduzir o


código fonte pré-processado em linguagem assembly (linguagem de máquina) para uma CPU
específica.

Isto significa que um programa compilado para o sua CPU específica pode ser
computacionalmente mais eficiente que um programa distribuído para uma determinada
arquitetura de processadores.

O comando "gcc -S" compila o arquivo hello.c e gera um código de máquina na linguagem
Assembly:

$ gcc -S hello.c
$ cat hello.s
.file "hello.c"
.text
.section .rodata
.LC0:
.string "Ola mundo."
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $.LC0, %edi
movl $0, %eax
call printf
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (GNU) 7.3.1 20180712 (Red Hat
7.3.1-6)"
.section .note.GNU-stack,"",@progbits

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 163


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

É esta linguagem que os programadores tinham de escrever os seus programas antes do


advento do compilador de alto nível.

ASSEMBLER

O estágio seguinte é chamado de assembler. Nesta etapa o GCC converte o código de


máquina de um processador específico num arquivo objeto. Se neste código existirem
chamadas externas de funções das bibliotecas, o gcc deixa seus endereços indefinidos para
serem preenchidos posteriormente pelo estágio de ligação.

A opção "gcc -o" gera o código objeto apropriado para o processador da máquina:

$ gcc -c hello.c
$ ls -l hello*
-rw-rw-r-- 1 ec2-user ec2-user 59 dez 15 18:00 hello.c
-rw-rw-r-- 1 ec2-user ec2-user 1504 dez 15 18:10 hello.o
-rw-rw-r-- 1 ec2-user ec2-user 470 dez 15 18:06 hello.s

Neste ponto, o programa já está em código de máquina do processador de 64 bits padrão


CISC da Intel, mas ainda não é um executável, pois não foi ligado as bibliotecas.

LINKER

O último estágio chamado de ligação, ou linker, é responsável por ligar os arquivos objeto
para criar um arquivo executável. Ele faz isto preenchendo os endereços das funções
indefinidas nos arquivos objeto com os endereços das bibliotecas externas do sistema
operacional.

Isto é necessário porque os arquivos executáveis precisam de muitas funções externas do


sistema e de bibliotecas do C++ para serem executados.

As bibliotecas podem ser ligadas ao executável preenchendo os endereços das bibliotecas


nas chamadas externas ou de forma estática quando as funções das bibliotecas são copiadas
para o executável.

É nesta etapa que a biblioteca stdio se liga ao arquivo objeto hello.o.

Essa ligação pode ser dinâmica, de forma que o programa se ligará à biblioteca através de
uma referência, e ficará dependente delaspara funcionar. Este esquema economiza recursos,
pois uma biblioteca utilizada por muitos programas precisa ser carregada somente uma vez
na memória. O tamanho do executável também será pequeno.

Porém, se a biblioteca instalada for de uma versão diferente da que o executável necessita,
ou se a biblioteca não existir no sistema, o programa não será executado.

Para compilar e ligar o programa de forma dinâmica as bibliotecas:

$ gcc hello.c -o hello_dinamico

164 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Outra forma de fazer a ligação e tornar o programa independente, é copiar a biblioteca para
o código do programa. Este esquema permite que o programa execute sem a necessidade da
biblioteca. A desvantagem será o grande tamanho do executável e necessidades de mais
memória para a sua execução, uma vez que as funções de biblioteca não são compartilhadas
entre os programas.

Para compilar e copiar as funções necessárias das bibliotecas para dentro do executável do
programa:

$ gcc -static hello.c -o hello_estatico

Observe a diferença de tamanho do programa compilado dinamicamente e do programa


compilado estaticamente:

$ ls -l hello*
-rw-rw-r-- 1 uiraribeiro uiraribeiro 59 Dec 15 18:25 hello.c
-rwxrwxr-x 1 uiraribeiro uiraribeiro 16696 Dec 15 18:25
hello_dinamico
-rwxrwxr-x 1 uiraribeiro uiraribeiro 862960 Dec 15 18:26
hello_estatico

O programa ligado dinamicamente as bibliotecas têm um tamanho 51 vezes menor que o


programa compilado estaticamente.

Porém, o programa compilado dinamicamente necessita de certas bibliotecas para funcionar


corretamente. O utilitário ldd pode informar quais são as bibliotecas que o programa
hello_dinamico necessita:

$ ldd hello_dinamico
linux-vdso.so.1 (0x00007fffcd1a0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6
(0x00007f2224a09000)
/lib64/ld-linux-x86-64.so.2 (0x00007f2224c11000)

Já o programa hello_estatico pode ser executado sem problemas em qualquer Linux com um
processador baseado em x86:

$ ldd hello_estatico
not a dynamic executable

Pela economia em disco e memória, é raríssimo os programadores compilarem os seus


programas em modo estático.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 165


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Baixando o Código Fonte


Uma vez que um desenvolvedor terminou seu programa, ele pode disponibilizar o código-
fonte na Internet. Isto geralmente pode ser feito de duas formas: em seu próprio site ou blog,
onde mantém alguma documentação sobre o programa e também um fórum para discussão
ou tirar dúvidas.

A outra forma bem comum é utilizar um repositório de software, como o PECL, GITHUB, PYPL,
etc. Esses repositórios permitem o controle de versão de código-fonte, bem como a interação
entre diversos programadores e colaboradores do projeto. É comum também os repositórios
criarem a sua própria ferramenta para baixar e publicar software.

Os programas em código-fonte geralmente são disponibilizados em um formato de arquivo


compactado com a extensão .zip, .tar.gz, .tar.bz2, .tar.xz ou .tgz. O tipo de extensão
indica qual o tipo de compactador de software utilizado.

Para baixar o software em um ambiente gráfico Desktop, o usuário pode utilizar o próprio
navegador de Internet para baixar o software para seu computador.

Entretanto, o exame cobra o conhecimento de duas ferramentas para baixar software no


terminal: wget e o cURL.

wget

O wget é uma ferramenta que pode ser utilizada para baixar software no terminal. Nem
sempre o wget pode estar instalado como padrão, e sua instalação pode ser feita de forma
simples utilizando um gerenciador de pacotes.

Seu uso também é muito simples, bastando oferecer ao comando um parâmetro com a URL
do arquivo que se deseja baixar:

$ wget
https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.4.3.tar.xz
Connecting to cdn.kernel.org
(cdn.kernel.org)|151.101.93.176|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 109443116 (104M) [application/x-xz]
Saving to: ‘linux-5.4.3.tar.xz’
linux-5.4.3.tar.xz 100%[==========>] 104.37M 34.4MB/s in
3.0s
linux-5.4.3.tar.xz saved [109443116/109443116]

O wget permite baixar conteúdo da Internet através dos protocolos HTTP, HTTPS, FTP e FTPS.
Basta especificar o protocolo, seguido do nome do host completo, e o caminho do arquivo.

cURL

O cURL é uma utilitário muito parecido com o wget, mas suporta mais protocolos como IMAP,
LDAP, POP3, RTSP, SCP, SFTP e SMTP. Pode ser necessário a sua instalação no Linux,
166 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

utilizando um gerenciador de pacotes, assim como o wget.

Como padrão, o cURL baixa o conteúdo requisitado como parâmetro, e o exibe na saída
padrão. Para salvar um arquivo, é necessário utilizar a opção "-o" seguido do nome do
arquivo:

$ curl
https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.4.3.tar.xz -
o linux.tar.xz
% Total % Received % Xferd Average Speed Time Time
Time Current
Dload Upload Total Spent
Left Speed
100 104M 100 104M 0 0 4524k 0 0:00:23 0:00:23 -
-:--:-- 25.5M

Uma vez baixado o software, é hora de extrair o conteúdo do arquivo, geralmente utilizado a
ferramenta Tarball em conjunto com algum compactador de software.

Arquivos tarball

Os arquivos tarball são distribuições de software livre que mantêm uma estrutura de
diretórios, arquivos fonte, um arquivo Makefile, documentação e outros arquivos,
encapsulados em um arquivo tar com compressão de dados gzip. Este método de
distribuição de software é muito popular porque os utilitários tar e gzip são muito comuns.

O resultado é um arquivo com sufixo .tar.gz ou .tgz.

É possível encontrarmos os arquivos tarball com o sufixo .bz2 e .tbz2. Estes arquivos foram
compactados com o bzip2 que utiliza um algoritmo de compressão de dados melhor que o
gzip.

Recentemente, é possível também encontrar arquivos tarball com o sufixo .xz, que utiliza o
compactador xz, que consegue taxas de compressão de dados melhores que o bz2.

O nome deste comando provém de “Tape-ARchive”. Ele lê arquivos e diretórios e salva em


fita ou arquivo.

Juntamente com os dados, ele salva informações importantes como a última modificação,
permissões de acesso e outros. Isso o torna capaz de restaurar o estado original dos dados.

As opções do comando tar não são tão opcionais assim. Ele recebe pelo menos dois
argumentos:

opções: Diz o que o tar deve fazer


[fonte]: Se o tar for utilizado para fazer backup, este parâmetro pode ser um

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 167


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

arquivo, um dispositivo, um diretório a ser copiado;


[destino]: Se o comando for utilizado para backup, esta opção irá especificar o
destino para os dados. Pode ser um arquivo tarball ou um dispositivo. Se for utilizado
para restaurar os arquivos, ela irá especificar um arquivo tarball e um dispositivo de
onde os dados serão extraídos.

Primeiro deve-se escolher o que tar deve fazer através das opções:

-c: Cria um novo arquivo .tar;


-u: Adiciona mais arquivos ao arquivo .tar somente se estes forem novos ou
modificados;
-r: Adiciona os arquivos especificados no final do arquivo .tar;
-g: Cria um backup incremental;
-t: Lista o conteúdo de um arquivo .tar;
-x: Extrai os arquivos de arquivo .tar;

Ele ainda tem opções auxiliares:

-j: Utiliza o bzip2 para compactar e descompactar os arquivos .tar.bz2;


-J: Utiliza o xz para compactar e descompactar os arquivos .tar.xz
-z: Utiliza o gzip para compactar e descompactar os arquivos .tar.gz;
-v: Lista todos os arquivos processados;
-f: Indica que o destino é um arquivo em disco, e não uma unidade de fita magnética;

As opções do tar podem ser combinadas em um único parâmetro como "cvzf".

Por ser um comando que originalmente foi feito para ler/gravar em fita, para criar um
arquivamento tar ou ler um arquivamento tar em disco, deve-se sempre usar a opção "f".

Exemplos:

Para salvar um determinado diretório /var/lib/mysql em um no arquivo


/var/backup/mysql.tar.gz:

$ tar cvzf /var/backup/mysql.tar.gz /var/mysql

Para extrair o mesmo pacote:

$ tar xvzf /var/backup/mysql.tar.gz –C /

Você poderá abrir o conteúdo de um arquivo tarball de duas formas:

$ gzip –d arquivo.tar.gz
O comando gzip descomprime o arquivo.tar.gz e retira o sufixo .gz.
168 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

$ tar xvf arquivo.tar

O utilitário tar extrai o conteúdo do pacote.

Podemos também utilizar formas mais simples:

$ tar xvzf arquivo.tar.gz

Ou

$ gzip –dc arquivo.tar.gz | tar xv

Se o arquivo for compactado com o bzip2, ele deve ser descompactado pelo bunzip2 ou
utilizar a opção –d do bzip2.

$ bzip2 –d arquivo.tar.bz2

Ou

$ bunzip2 arquivo.tar.bz2

$ tar xvf arquivo.tar

No caso dos arquivos compactados com xz, pode-se utilizad o comando xz:

$ xz -d linux.tar.xz

Seguido de:

$ tar xvf linux.tar

OU

$ tar xvJf linux.tar.xz

No ambiente gráfico, você pode descompactar e extrair um arquivo tarball sem muito
esforço, apenas clicando no arquivo. Desta forma o Linux invocará em segundo plano o

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 169


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

compactador de dados apropriado, juntamente com o tar para extrair o pacote de dados no
diretório corrente.

Veja a comparação entre a compactação realizada pelos compactadores gzip, bzip2 e xz e


um arquivo tar sem compactação:

$ ls -1shS linux*
895M linux.tar
165M linux.tar.gz
126M linux.tar.bz2
105M linux-5.4.3.tar.xz

Para o exame, é recomendado memorizar a seguinte tabela:

Extensão Compactador Utilizado Opção do Tar

.tar.gz Gzip $ tar xvzf arquivo.tar.gz

.tar.bz2 Bzip2 $ tar xvjf arquivo.tar.bz2

.tar.xz Xz $ tar xvJf arquivo.tar.xz

Compilando Software

Uma vez que o software foi baixado da Internet e extraído o conteúdo de seu pacote, é hora
de compilar o código fonte.

É muito comum os desenvolvedores ao criar seu software e distribuir seu código fonte,
incorporar dois arquivos especiais que facilitam muito a compilação dos programas:
configure e Makefile.

configure
O "configure" é um script que o desenvolvedor cria para checar se a máquina tem todos os
requisitos necessários para a compilação do software. Isto geralmente envolve checar se
existe o compilador necessário e se todas as bibliotecas necessárias estão instaladas.

O configure também permite que o usuário habilite ou desabilite alguma função do software
no momento da compilação.

Pode-se ver as opções que o configure permite com a opção "--help":

$ ./configure --help
Uma vez que o configure é executado, ele faz toda a checagem e programas, bibliotecas e
170 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

dependências para compilar o software.

$ ./configure

Ele criará um arquivo especial chamado Makefile, que contém as diretivas de compilação do
software.

Se houver alguma problema ou falta de alguma dependência, o configure irá alertar o


usuário, para que esta dependência seja satisfeita, e então o configure possa ser executado
novamente, até que o Makefile seja gerado.

~/httpd-2.4.41$ ./configure
checking for chosen layout... Apache
checking for working mkdir -p... yes
configure: Configuring Apache Portable Runtime library...
checking for APR... no
configure: error: APR not found. Please read the documentation.

Makefile
O Makefile é um arquivo na forma de um script, que contém os comandos para compilar o
software, customizados para a máquina em questão, com as opções que o configure habilitou
ou desabilitou.

Para que o software seja compilado, é necessário o utilitário make para ler o conteúdo do
Makefile, e disparar o processo de compilação do software.

make
O utilitário make é necessário para compilarmos múltiplos arquivos de código fonte de um
projeto. Ele utiliza um arquivo de descrição geralmente nomeado como Makefile. O conteúdo
deste arquivo contém regras que definem as dependências entre arquivos fonte e os
comandos necessários para a compilação.

A partir deste arquivo de descrição ele cria seqüências de comandos que são interpretados
pelo shell. Geralmente o compilador gcc é invocado com diversas opções que completam as
dependências de outros arquivos objetos e bibliotecas.

Mesmo os menores projetos de software contêm vários arquivos que tem uma
interdependência e o comando make e o Makefile facilitam muito o processo de compilar
software.

Para compilar o software, simplesmente digite make no diretório corrente do projeto de


software:

$ make

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 171


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Desta forma, o make irá ler o Makefile e fazer todo o processo de compilação do software.

É possível no momento da compilação acontecerem erros, principalmente de falta de


bibliotecas ou problemas na versão das bibliotecas, que não foram previstos pelo
desenvolvedor ao se criar o configure.

Uma vez compilado o software, pode-se usar a diretiva "install" do make para instalar o
software recém compilado nos diretórios apropriados no Linux:

$ make install

Feito isso, o software será devidamente instalado no sistema.

Os programas que são construídos desta forma geralmente foram empacotados usando um
conjunto de programas referidos como autotools. Esta suíte inclui autoconf, automake e
muitos outros programas, todos eles trabalham juntos para tornar a vida de um mantenedor
de software significativamente mais fácil. O usuário final não vê essas ferramentas, mas eles
eliminam a dor de configurar um processo de instalação que será executado de forma
consistente em diferentes distribuições Linux.

Gerenciamento de Bibliotecas
Compartilhadas

Determinar quais as bibliotecas compartilhadas de que um programa executável depende


para executar e instalá-las quando necessário faz parte dos objetivos do exame.

Como visto anteriormente, as bibliotecas são conjuntos de software, compostos de funções e


procedimentos que os programadores podem usar para escrever os seus programas sem a
necessidade de recriar tudo.

Dificilmente um programador quando escreve um programa necessite reescrever as funções


de baixo nível, tais como mostrar algo na tela, pixel a pixel, ou gravar algo no disco byte a
byte. Ele usa uma função pronta que faz esse trabalho.

Então, durante o desenvolvimento de um programa, o programador faz uso das diversas


funções e procedimentos já definidos pelo sistema operacional em arquivos chamados de
bibliotecas. Estas funções permitem que o programador possa usar recursos como escrita em
disco, escrita na tela, receber dados do teclado, do mouse, enviar dados pela rede e muito
mais, com uma linguagem de alto nível.

Com o Linux não é diferente: os programas, utilitários e aplicativos fazem uso das
bibliotecas, que contém os pedaços de software já pronto. Desta forma, os programas são
ligados às bibliotecas, e quando executado, ele carrega na memória as bibliotecas que
necessita para a sua execução.

Desta maneira, os executáveis gerados são mais eficientes, pois tendem a ser menores, usar
menos memória e ocupar menos espaço em disco. O ponto fraco desta metodologia é que os

172 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

programas necessitam das bibliotecas compartilhadas e uma mudança nas versões destes
arquivos também pode afetar o seu funcionamento.

As bibliotecas podem ser entendidas de modo grosseiro como as “DLLs” do Windows. No


Linux existem dois diretórios padrão que abrigam as bibliotecas:

/lib Bibliotecas compartilhadas de uso geral


/lib[arquitetura] Bibliotecas compartilhadas específicas da arquitetura do
processador. Por exemplo: /lib64 ou /lib32

Toda biblioteca compartilhada tem um nome especial chamado de “soname”. O soname é


composto pelo prefixo “lib”, seguido do nome da biblioteca, o sufixo “.so.” e o número da
versão da biblioteca que é incrementado quando esta sofre alterações na sua interface.

Por exemplo:

libjack-0.80.0.so.0
libvorbis.so.0
libWand.so.6
libjpeg.so.62
libwv2.so.1

Quando um programa é executado, ele é examinado por um programa de ligação em tempo


de execução chamado ld.so.

O ld.so é um interpretador especial que completa as ligações entre o executável e as


bibliotecas compartilhadas que o programa usa. Se o ld.so não conseguir encontrar e ler as
dependências de biblioteca, ele irá falhar, e o programa não será executado. Quando isso
acontece, o sistema devolve um erro de falta de biblioteca.

Ainda é possível que um programa dependa de uma biblioteca em uma determinada versão,
mas no sistema há uma versão diferente, com uma interface diferente, de forma que as
funções que o programa necessita, não podem ser executadas na versão da biblioteca
instalada. Isso gera um erro de tempo de execução de versão de biblioteca.

O linker ld.so mantém índice de todas as bibliotecas instaladas e a sua localização no disco
num arquivo especial chamado /etc/ld.so.cache.

O ld.so.cache é um arquivo binário e, portanto, pode ser lido rapidamente pelo ld.so. Este
arquivo binário é gerado a partir de um arquivo texto chamado /etc/ld.so.conf que contém
uma lista com os diretórios das bibliotecas.

Dependendo da distribuição Linux, o arquivo /etc/ld.so.conf aponta para o diretório


/etc/ld.so.conf.d que contém arquivos com a lista de diretórios com as bibliotecas,
separando as listas por aplicação ou outra lógica qualquer.

$ ls -1 /etc/ld.so.conf.d
bind-export-x86_64.conf

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 173


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

dyninst-x86_64.conf
kernel-4.19.82-30.69.amzn2.x86_64.conf
mariadb-x86_64.conf

Por exemplo, o arquivo mariadb-x86_64.conf contém o caminho para o diretório com as


bibliotecas necessárias para execução do banco de dados MariaDB:

$ cat mariadb-x86_64.conf
/usr/lib64/mysql

O programa ldconfig é responsável por ler a lista de diretórios de bibliotecas e gerar o


arquivo binário ld.so.cache.

Desta forma, toda vez que uma biblioteca for instalada, é necessário executar o ldconfig
para atualizar o índex de bibliotecas.

É crucial que um administrador Linux saiba gerenciar as bibliotecas compartilhadas para um


correto funcionamento do sistema e os seus aplicativos.

Vejamos os utilitários que irão ajudar nesta tarefa:

ldd
$ ldd programa

O comando ldd – List Dynamic Dependencies – fornece uma lista das dependências
dinâmicas que um determinado programa precisa. Ele irá retornar o nome da biblioteca
compartilhada e a sua localização esperada no disco.

Exemplos:

$ ldd /bin/bash
libreadline.so.4 => /lib/libreadline.so.4 (0x4001c000)
libhistory.so.4 => /lib/libhistory.so.4 (0x40049000)
libncurses.so.5 => /lib/libncurses.so.5 (0x40050000)
libdl.so.2 => /lib/libdl.so.2 (0x40096000)
libc.so.6 => /lib/libc.so.6 (0x40099000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

Neste exemplo, o programa do bash necessita de todas estas bibliotecas para funcionar.

O comando ldd é importante para determinarmos qual são as bibliotecas necessárias de um


executável.

174 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Quando acontece um erro durante a execução de um programa, reclamando a falta de uma


biblioteca ou versão incorreta, o programa ldd pode ser utilizado para se determinar qual é a
biblioteca e a versão dela que deve ser instalada para o correto funcionamento do programa.

ldconfig
# ldconfig [opções] diretório_de_bibliotecas

O utilitário ldconfig cria os links e refaz o índice das bibliotecas dinâmicas do arquivo
/etc/ld.so.cache. Ele procura por bibliotecas nos diretórios /usr/lib e /lib, assim como nos
diretórios listados em /etc/ld.so.conf, bem como o diretório informado na linha de comando.

As opções mais comuns são:

-p: Lista o conteúdo do cache /etc/ld.so.cache.


-v: Mostra o progresso da atualização do cache.
-f: arquivo informa um outro arquivo de configuração diferente do padrão
/etc/ld.so.conf.

Exemplos:

# ldconfig –p
229 libs found in cache ‘/etc/ld.so.cache’
src_vipa.so (ELF) => /usr/lib/src_vipa.so
libz.so.1 (libc6) => /lib/libz.so.1
libz.so.1 (libc6) => /usr/lib/libz.so.1
liby2util.so.3 (libc6) => /usr/lib/liby2util.so.3
liby2pm.so.2 (libc6) => /usr/lib/liby2pm.so.2
liby2.so.2 (libc6) => /usr/lib/liby2.so.2
libyui.so.2 (libc6) => /usr/lib/libyui.so.2
libycp.so.2 (libc6) => /usr/lib/libycp.so.2

# ldconfig –v
/usr/X11R6/lib:
libSM.so.6 -> libSM.so.6.0
libdps.so.1 -> libdps.so.1.0
libXrender.so.1 -> libXrender.so.1.2
(…)

LD_LIBRARY_PATH

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 175


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Ainda é possível fornecer ao linker em tempo de execução ld.so uma lista de diretórios extras
que podem conter bibliotecas compartilhadas através da variável ambiental
LD_LIBRARY_PATH.

Uma lista de diretórios poderá ser configurada, separando-os por dois pontos “:”. Esta lista
antecede a lista do arquivo ls.so.conf.

# set | grep LD_LIBRARY_PATH


LD_LIBRARY_PATH=/usr/lib

Por razões de segurança, a variável LD_LIBRARY_PATH é ignorada pelo ld.so quando este faz
ligações de programas que possuem o bit SUID ou SGID habilitados.

Seu uso é comum para testar novas rotinas em bibliotecas em desenvolvimento ao invés de
executar as rotinas já instaladas.

Toda vez que uma nova biblioteca for instalada, ou versão de biblioteca, é necessário
atualizar o cache do linker ld.so com o comando ldconfig.

Raramente você precisará utilizar os comandos ldd e ldconfig se você instalar software no
Linux utilizando um gerenciador de pacotes, pois os gerenciadores também instalam as
dependencias de um software, de forma que as bibliotecas que o software necessita também
são instaladas e o arquivo ld.so.cache é refeito no momento da instalação dos pacotes.

Mas se você baixar um software em código fonte, e for compilar este software, pode ter
certeza que possivelmente irá esbarrar em um erro de falta de bibliotecas ou versão
incorreta.

Gerenciamento de Pacotes Debian

Este tópico irá abordar as tarefas de gerenciamento de pacotes Debian. Durante o exame,
você deverá ser capaz de usar ferramentas de linha de comando para instalar, atualizar,
desinstalar pacotes, obter informações como versão, conteúdo, dependências, integridade e
estado de instalação.

O gerenciamento de pacotes é uma excelente maneira de distribuir, instalar e desinstalar


software.

Um pacote em poucas palavras é um arquivo que contém as informações necessárias para


que o gerenciador de pacotes possa instalar, manter e remover os programas como também
os demais arquivos necessários de um determinado aplicativo.

Uma característica importante do Linux é a modularização de seus componentes e o uso


intensivo de bibliotecas compartilhadas. Isso se aplica também aos pacotes de aplicativos. É
bastante comum um programador utilizar bibliotecas compartilhadas e não as incluir no seu
aplicativo.

É comum ao tentarmos instalar um determinado pacote ser necessário primeiro instalar


176 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

outro pacote que contenha os pré-requisitos ou as bibliotecas para a sua instalação. Cada
pacote carrega as informações de dependências necessárias.

Grandes projetos de software usam distribuir os diversos módulos de seu aplicativo em


diversos pacotes que podem ou não ser instalados de acordo com o seu uso. A organização
de um aplicativo em vários pacotes permite que o administrador instale somente aqueles
que são realmente necessários, evitando ter que instalar componentes que não serão
utilizados. Seguindo a linha de gerenciadores de pacotes, duas grandes distribuições Linux se
destacaram.

A Debian uniu as ferramentas GNU, o Kernel do Linux e outros softwares livres importantes
formando a distribuição chamada Debian GNU/Linux. Esta distribuição é feita de um grande
número de pacotes de softwares. Cada pacote na distribuição contém programas
executáveis, scripts, documentação e informações de configuração. O gerenciador de
pacotes do Debian é versátil e robusto. O Ubuntu e o SteamOS seguem o padrão Debian.

Também a empresa americana Red Hat foi uma das pioneiras no tratamento sério do Linux.
Desde o início ela é uma das principais distribuições mundiais com grande influência.
Criadora do RPM, o gerenciador de pacotes mais usado atualmente no Linux, a Red Hat tem
uma distribuição voltada para o mercado de servidores. O Fedora, Mandriva, SuSE,
OpenSuSe, CentOS e o Oracle Linux seguem o padrão RPM.

A Debian está atenta para detalhes que nos permitem produzir programas de alta qualidade
e estabilidade. As instalações podem ser facilmente configuradas para servir múltiplos
propósitos, como firewalls com poucos pacotes, estações desktop científicas e servidores de
rede de alto desempenho.

Esta distribuição é especialmente popular entre usuários avançados por causa de sua
excelência técnica e atenção às necessidades e expectativas da comunidade Linux. A Debian
também introduziu muitas características ao sistema que agora são rotineiras como o
sistema de gerenciamento de pacotes para instalação e remoção fácil de software e também
a possibilidade de permitir a atualização do sistema sem requerer a reinstalação.

As ferramentas do gerenciador de pacotes possibilitam ao administrador de um sistema


Debian o controle completo dos softwares instalados, incluindo a habilidade de instalar um
simples pacote ou automaticamente atualizar todo o sistema operacional. Os pacotes
também podem ser protegidos para não serem atualizados.

Os nomes dos pacotes Debian acompanham o seguinte padrão:

Nome do Pacote: O nome do pacote é uma breve descrição do seu conteúdo. Se


mais de uma palavra for usada, é separada por traço;
Versão do software: Cada pacote tem um número de versão próprio, que pode
variar entre versão principal e correções aplicadas;
Versão do pacote: Os pacotes também podem ter versões diferentes de
distribuição. A versão do pacote também pode indicar para qual plataforma ele foi
preparado;
Extensão .deb: Para fácil identificação dos pacotes Debian.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 177


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Exemplos:

abiword-gtk_1.0.2+cvs.2002.06.05-1_i386.deb
abiword-plugins_1.0.2+cvs.2002.06.05-1_i386.deb
abook_0.4.16-1_i386.deb
abuse_2.00+-3_i386.deb
abuse-frabs_2.10-3_all.deb
abuse-lib_2.00-14_all.deb
abuse-sdl_0.6.1-1_i386.deb
acct_6.3.5-32_i386.deb
ace-of-penguins_1.2-3_i386.deb
acfax_981011-7_i386.deb

dpkg
# dpkg [opções] ação

O utilitário dpkg é responsável pelo gerenciamento de pacotes em sistemas Debian.

Ele mantém as informações dos pacotes instalados basicamente nos arquivos


/var/lib/dpkg/available e /var/lib/dpkg/status. Estes arquivos contêm a lista de pacotes
disponíveis e status, respectivamente.

As opções mais frequentes são:

-E: Esta opção não regrava um pacote já instalado de mesma versão;


-G: Esta opção não regrava um pacote já instalado, mesmo que seja mais antigo;
-R: Processa todos os pacotes encontrados em determinado diretório de forma
recursiva.

As ações mais frequentes são:

-i nomedopacote: Instala o pacote nomedopacote. Este processo envolve fazer


cópia backup dos arquivos antigos que já existirem no sistema, desempacotamento,
instalação e configuração. Esta ação também pode ser referenciada com –install
nomedopacote;
-l chavebusca: Lista as informações dos pacotes que contenham no nome a mesma
chave de busca;
-L nomedopacote: Lista os arquivos instalados pelo pacote nomedopacote;
--print-avail nomedopacote: 'Lista todas as informações disponíveis sobre o
pacote nomedopacote em /var/lib/dpkg/avaliable;
--purge nomedopacote: Remove todo o pacote nomedopacote;
-r nomedopacote: Remove todos os arquivos do pacote, menos as configurações;
178 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

-s nomedopacote: Mostra o status do pacote;


-S arquivo: Procura por um arquivo nos pacotes instalados;
--unpack nomedopacote: Desempacota um pacote, mas não instala;
--configure nomedopacote: Configura um pacote não instalado.

Exemplos:

Instala o pacote acct_6.3.5-32_i386.deb.

# dpkg -i acct_6.3.5-32_i386.deb

Remove o pacote ace-of-penguins_1.2-3_i386.deb do sistema completamente.

# dpkg --purge ace-of-penguins_1.2-3_i386.deb

Configura o pacote abook_0.4.16-1_i386.deb.

# dpkg --configure abook_0.4.16-1_i386.deb

O dpkg também pode ser utilizado para se descobrir a qual pacote determinado arquivo
pertence:

# dpkg -S stdio.h
libc6-dev: /usr/include/stdio.h
libc6-dev: /usr/include/bits/stdio.h
perl: /usr/lib/perl/5.6.0/CORE/nostdio.h

Outra possibilidade é descobrir os pacotes instalados no sistema a partir de uma chave:

# dpkg -l | grep mozilla


ii mozilla-browse 0.9.6-7 Mozilla Web Browser

O arquivo /etc/dpkg/dpkg.cfg contém as opções padrão quando o dpkg é executado.

Os arquivos de controle do dpkg residem no diretório /var/lib/dpkg. Dois arquivos


interessantes neste diretório são:

/var/lib/dpkg/available: Lista de pacotes disponíveis;


/var/lib/dpkg/status: Estado dos pacotes instalados. Informa quando foram instalados,
removidos etc.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 179


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

dpkg-reconfigure
# dpkg-reconfigure [nome do pacote]

O comando dpkg-reconfigure reconfigura um pacote já instalado no sistema. Ele tem o


mesmo efeito da re-instalação do pacote.

Exemplo:

# dpkg-reconfigure debconf

apt-get
# apt-get [opções] [comando] [nome do pacote]

O comando apt-get (Advanced Package Tool) é um gerenciador avançado de pacotes. Ele


pode utilizar arquivos locais ou remotos para realizar instalação ou atualização de pacotes.
Desta maneira é possível atualizar todo o sistema Debian via ftp ou http. Este gerenciador
também mantém informações dos pacotes e suas dependências.

Devido a sua facilidade de operação, o apt-get é o método preferido para se manipular


pacotes. Este utilitário oferece dezenas de opções configuradas no arquivo
/etc/apt/apt.conf.

O arquivo /etc/apt/sources.list contém os locais onde o apt-get encontrará os pacotes, a


distribuição verificada (stable, testing, unstable, Woody, Sarge) e a seção que será copiada
(main, non-free, contrib, non-US).

Abaixo um exemplo simples de arquivo /etc/apt/sources.list com explicação das seções:

deb http://www.debian.org/debian stable main contrib non-free


deb http://nonus.debian.org/debian-non-US stable non-US

No arquivo /etc/apt/apt.conf podemos especificar opções que modificarão o


comportamento do programa apt-get durante a manipulação dos pacotes.

O apt-get utiliza uma lista de pacotes para verificar se os pacotes existentes no sistema
precisam ou não ser atualizados. A lista mais nova de pacotes é copiada através do comando
apt-get update.

O apt-get é muito útil, pois o administrador não precisa copiar manualmente da Internet o
pacote que deseja instalar, muito menos lidar com as dependências, desde que o que ele
precisa esteja nos repositórios indicados no sources.list.
180 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

As opções mais frequentes deste utilitário são:

-d: Baixa os arquivos, mas não instala. É útil para baixar grandes volumes de pacotes
para posterior instalação;
-s: Simula a instalação dos pacotes, mas não realiza modificações;
-y: Responde afirmativamente por todas as perguntas feitas durante o processo de
instalação/desinstalação dos pacotes.

Os comandos mais frequentes são:

dist-update: Este comando faz a atualização automática do sistema Debian;


install: Este comando instala um determinado pacote especificado pelo nome;
remove: Este comando remove um determinado pacote especificado pelo nome;
update: Este comando faz uma lista de todos os pacotes disponíveis. O processo é
feito automaticamente antes de qualquer modificação nos pacotes;
upgrade: Este comando é utilizado para fazer uma atualização segura do sistema,
pois ele não instala pacotes que podem causar algum conflito ou falha nos arquivos
de configuração.

Exemplos:

# apt-get install airsnort

Instala o pacote airsnort.x.y.deb. Este comando aceita instalar mais de um pacote separando
os nomes por espaços. Somente é preciso especificar o nome do pacote, sem a versão (X),
revisão (Y) e sufixo (.deb).

Se for preciso, o apt-get irá instalar automaticamente as dependências necessárias para o


funcionamento correto de um pacote.

O apt-get é muito usado também para fazer atualização de todos os pacotes do sistema, com
o comando update para atualizar as bases de dados com os pacotes novos e posteriormente
o comando upgrade para fazer as atualizações:

# apt-get update
# apt-get upgrade

O apt-get pode atualizar toda a sua distribuição de uma forma inteligente e segura. Ele lê a
listagem de pacotes disponíveis no servidor remoto, verifica quais estão instalados e suas
versões e atualiza os pacotes antigos.

# apt-get dist-update

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 181


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

apt-cache
# apt-cache comando [nome do pacote]

O utilitário apt-cache é para manipular e obter informações sobre os pacotes no cache do


apt.

Ele deve ser usado em conjunto com alguns comandos, a seguir:

# apt-cache add: Adiciona um pacote ao cache do apt;

# apt-cache gencaches: Gera o cache do apt;

# apt-cache showpkg: Mostra algumas informações sobre um determinado pacote;

# apt-cache stats: Mostra algumas estatísticas;

# apt-cache check: Verifica a sanidade do cache;

# apt-cache search: Procura na lista de pacotes por uma determinada ocorrência;

# apt-cache show: Mostra detalhes sobre um determinado pacote;

# apt-cache depends: Mostra as dependências de software de um determinado


pacote;

# apt-cache pkgnames: Lista o nome de todos os pacotes.

O apt-cache pode ser utilizado para descobrirmos os pacotes que contêm emuladores do
Atari:

# apt-cache search atari


stella - Atari 2600 Emulator for X windows

Também pode ser utilizado para se saber mais sobre um determinado pacote, como o
emulador Stella:

# apt-cache show stella


Package: stella
Priority: extra
Section: non-free/otherosfs
Installed-Size: 83
Maintainer: Tom Lear <tom@trap.mtview.ca.us>
Architecture: i386
Version: 1.1-2
Depends: libc6 (>= 2.1), libstdc++2.10, xlib6g (>= 3.3.5-1)
Filename: dists/potato/non-free/binary-
182 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

i386/otherosfs/stella_1.1-2.deb
Size: 483430
MD5sum: 11b3e86a41a60fa1c4b334dd96c1d4b5
Description: Atari 2600 Emulator for X windows
Stella is a portable emulator of the old Atari 2600 video-game
console
written in C++. You can play most Atari 2600 games with it. The
latest
news, code and binaries for Stella can be found at:
http://www4.ncsu.edu/~bwmott/2600

Ou se deseja simplesmente saber quais são as dependências de um pacote:

# apt-cache depends penguin-command


penguin-command
Depends: libc6
Depends: libpng2
Depends: libsdl-mixer1.1
Depends: libsdl1.1
Depends: zlib1g

Repositórios no Debian

A suite de ferramentas de instalação de Software nas distribuições baseadas em Debian


utiliza os repositórios de software indicados no arquivo /etc/apt/sources.list e também no
diretório /etc/apt/sources.list.d.

Por padrão, cada distribuição Linux mantém o seu repositório de software, indicando neste
arquivo onde o Linux deve buscar pelos pacotes que a distribuição mantém.

Dito isto, é perfeitamente possível adicionar outros repositórios de software de terceiros, ou


até mesmo mudar o repositório padrão para um repositório de software em testes "beta".

No Ubuntu, o arquivo sources.list tem o seguinte conteúdo:

$ cat sources.list | grep -v "#"


deb http://security.ubuntu.com/ubuntu eoan-security main
restricted
deb http://security.ubuntu.com/ubuntu eoan-security universe
deb http://security.ubuntu.com/ubuntu eoan-security multiverse

A primeira palavra "deb" indica que se trata de pacotes binários de software, e a palavra

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 183


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

"deb-src" indica que são pacotes de código-fonte.

Logo em seguida, deve-se indicar a completa URL do repositório, indicando o protocolo de


acesso: http, https ou ftp.

Depois segue o nome da distribuição. No caso do Debian, isto pode ser o nome do código de
versão (jessie, stretch, buster, sid) ou a classe de versão (oldstable, stable, testing,
unstable) respectivamente.

Por último, indica-se o componente, que determinam o tipo de software:

MAIN: Contém todos os pacotes que estão completamente de acordo com o Debian
Free Software Guilines.
CONTRIB: É um conjunto de programas de código aberto que não podem funcionar
sem um elemento não livre.
NON-FREE: Contém programas os quais não estão (completamente) de acordo com
estes princípios do Software Livre, mas que podem, contudo, ser distribuídos sem
restrições.
UPDATES: Esse repositório recebe as atualizações de pacotes, com correções e
melhorias.
BACKPORTS: O repositório backports oferece “pacotes backports”. O termo refere-
se a um pacote de algum software recente, que foi recompilado para uma distribuição
mais velha, geralmente para Stable.
SECURITY: As atualizações de segurança não são hospedadas na rede habitual de
espelhos do Debian, mas em security.debian.org.
PROPOSED-UPDATES: depois de publicada, a distribuição stable é atualizada em
aproximadamente de dois em dois meses. o repositório atualizações-propostas é
onde as atualizações esperadas são preparadas (sob a supervisão dos gerentes de
versão estável).
DEBIAN MULTIMEDIA: Fornece pacotes para fins de edição de vídeo, imagem e
codecs, entre outros.

Essa lista de componentes pode variar a depender da distribuição Linux.

Adicionando um repositório

Para adicionar um repositório, basta incluir uma linha com a sintaxe abaixo no arquivo
sources.list:

deb https://servidor/caminho distribuição componente

Após configurar um repositório no arquivo sources.list, é necessário executar um dos


comandos da suite de ferramentas do apt da sua preferência, para que a lista de pacotes do
repositório seja baixada, e o repositório seja incorporado ao sistema:

$ apt-get update
184 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

Ou

$ aptitude update

Ou

$ apt update

O mesmo comando precisa ser executado se um repositório for removido do sistema.

Gerenciamento de Arquivos Red Hat e


YUM

O Red Hat Package Manager – RPM é um poderoso gerenciador de pacotes que permite ao
administrador instalar, remover e obter informações sobre pacotes. É um método de
distribuição de software largamente usado em várias distribuições Linux, além do Red Hat.

Ele também possibilita construir pacotes a partir de arquivos fonte, verificar a assinatura
digital, simular uma instalação, dentre outras. É tão poderoso quanto o dpkg e apt-get.

Este gerenciador de pacotes realiza de forma simples a instalação, manutenção e remoção


de pacotes de software.

Cada pacote rpm contém programas binários, arquivos de configuração, documentação e


informações de como eles devem ser instalados e suas dependências.

Este utilitário mantém um banco de dados de todos os pacotes instalados e seus arquivos,
controle de versões e dependências. Em algumas situações especiais o banco de dados pode
ficar corrompido. O gerenciador de pacotes conta com funções especiais para recuperar a
sua integridade.

Os pacotes rpm acompanham a seguinte nomenclatura:

Nome_do_pacote: Assim como nos pacotes Debian, um pacote rpm tem um nome
curto que descreve seu conteúdo. Se mais de uma palavra for utilizada é utilizado o
traço;
Versão do Software: Cada arquivo rpm tem a sua versão que podem variar de
acordo com os pacotes. Geralmente é numérica e são separada do nome por um
traço;
Distribuição do Software: Cada arquivo também pode ter uma distribuição ou
empacotamento diferente;
Arquitetura: O pacote rpm costuma carregar o nome da arquitetura para a qual foi
montado;
Sufixo .rpm: Ele utiliza a terminação .rpm para fácil identificação.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 185


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Exemplos:

binutils-2.27-28.base.el7_5.1.x86_64
python-backports-1.0-8.el7.x86_64
libstaroffice-0.0.4-1.el7.x86_64
adcli-0.8.1-4.el7.x86_64

Podemos encontrar também pacotes com nomes no formato pacote-versao.src.rpm. Esses


pacotes contêm os arquivos fontes de um software e são na grande maioria independentes
de arquitetura.

O gerenciador de pacotes rpm é utilizado por várias distribuições Linux. Mas os pacotes
podem diferir nas informações adicionais de uma distribuição para outra. Procure sempre
utilizar pacotes feitos especificamente para a sua distribuição.

Este gerenciador também faz o controle de dependências entre os pacotes. Eles contêm
informações das dependências de cada aplicativo, e essa informação é utilizada durante sua
instalação ou remoção. Caso a instalação de um novo pacote requeira outro, o rpm alertará o
administrador.

rpm
# rpm [modo] [opções] [pacotes]

O comando rpm é responsável pela instalação, remoção, atualização, conversão dos pacotes.
Este comando é organizado primeiro em modos de operação, que podem ser: consulta,
verificação, integridade, instalação, remoção, atualização e reconstrução do banco de dados
rpm. Cada modo de operação pode ou não conter várias opções disponíveis.

Os modos de operação mais frequentes são:

Para consultar a base de dados

# rpm {-q|--query} [opções de consulta] nome_do_pacote

Exemplo:

# rpm –q bash
bash-2.05b-207

Para verificar o status dos pacotes

# rpm {-V|--verify} nome_do_pacote

186 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Exemplo:

# rpm -V snort-2.0.1-98.i586.rpm
package snort-2.0.1-98.i586.rpm is not installed

Para verificar a assinatura e integridade dos pacotes

# rpm {-K|--checksig} nome_do_pacote

Exemplo:

# rpm -K libpcap-0.7.2-37.i586.rpm
libpcap-0.7.2-37.i586.rpm: sha1 md5 gpg OK

Para instalar um novo pacote:

# rpm {-i|--install} [opções de instalação] nome_do_pacote

Exemplo:

# rpm –i libpcap-0.7.2-37.i586.rpm

Para instalar um novo pacote mostrando detalhes da instalação:

# rpm –ivh libpcap-0.7.2-37.i586.rpm


Preparing... ####################### [100%]
1:libcap ####################### [100%]

Para atualizar um pacote:

# rpm {-U|--upgrade} [opções de instalação] nome_do_pacote

Exemplo:

# rpm -U libpcap-0.7.2-37.i586.rpm

package libpcap-0.7.2-37 is already installed

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 187


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Para remover um pacote:

# rpm {-e|--erase} [opções de remoção] nome_do_pacote

Exemplo:

# rpm –e libpcap-0.7.2-37.i586.rpm

Para refazer o banco de dados RPM:

# rpm {--initdb|--rebuilddb}

Exemplo:

# rpm --initdb

Para consultar as dependências de um pacote:

# rpm {—qpR }

Exemplo:

# rpm —qpR BitTorrent-5.2.2-1-Python2.4.noarch.rpm


/usr/bin/python2.4
python >= 2.3
python(abi) = 2.4
python-crypto >= 2.0
python-psyco
python-twisted >= 2.0
python-zopeinterface
rpmlib(CompressedFileNames) = 2.6

Para instalar um pacote ignorando as dependências (algo bem estúpido de se


fazer):

# rpm {—ivh --nodeps }

188 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Exemplo:

# rpm -ivh --nodeps BitTorrent-5.2.2-1-Python2.4.noarch.rpm


Preparing... ####################### [100%]
1:BitTorrent ####################### [100%]

Para listar os pacotes instalados recentemente:

# rpm {—qa --last }

Exemplo:

# rpm -qa --last


kernel-headers-3.14.34-27.48.amzn1.x86_64 Sex 06 Mar 2015
11:55:01 BRT
graphviz-gd-2.38.0-18.44.amzn1.x86_64 Sex 06 Mar 2015
11:55:00 BRT
file-devel-5.19-7.26.amzn1.x86_64 Sex 06 Mar 2015
11:55:00 BRT

Para saber a qual pacote um arquivo pertence:

# rpm {—qf arquivo }

Exemplo:

# rpm -qf /usr/bin/htpasswd


httpd24-tools-2.4.10-15.58.amzn1.x86_64

Para saber informações de um determinado pacote instalado:

# rpm {—qi nome_do_pacote }

Exemplo:

# rpm -qi httpd24


Name : httpd24
Version : 2.4.10
Release : 15.58.amzn1

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 189


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Architecture: x86_64
Install Date: Sex 13 Fev 2015 21:56:14 BRST
Group : System Environment/Daemons
Size : 3792099
License : ASL 2.0
Signature : RSA/SHA256, Qui 12 Fev 2015 17:35:50 BRST, Key ID
bcb4a85b21c0f39f
Source RPM : httpd24-2.4.10-15.58.amzn1.src.rpm
Build Date : Qui 12 Fev 2015 14:43:53 BRST
Build Host : build-64003.build
Relocations : (not relocatable)
Packager : Amazon.com, Inc. <http://aws.amazon.com>
Vendor : Amazon.com
URL : http://httpd.apache.org/
Summary : Apache HTTP Server
Description :
The Apache HTTP Server is a powerful, efficient, and extensible
web server.

Para verificar a integridade dos arquivos instalados com o banco de dados de


pacotes:

# rpm {—Va }

Exemplo:

# rpm -Va

S.5....T. c /etc/sysconfig/svnserve
....L.... c /etc/localtime
..?...... /usr/sbin/glibc_post_upgrade.x86_64
S.5....T. c /etc/httpd/conf/httpd.conf
..?...... /usr/sbin/suexec

As opções de consulta de informações de pacotes mais frequentes são:

-a Lista todos os pacotes instalados no sistema;


-f arquivo: Lista o nome do pacote que contém o arquivo procurado;
-p nomedopacote: Mostra se um determinado pacote está instalado;
-i nomedopacote: Mostra informações extras sobre um determinado pacote;
-l nomedopacote: Mostra a lista dos arquivos que um pacote contém;

190 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

-R nomedopacote: Mostra a lista de dependências que um pacote necessita para


ser instalado.

As opções de instalação e atualização de pacotes mais frequentes são:

--force: Esta opção força a instalação de um pacote e seus arquivos mesmo se ele já
estiver instalado. Esta opção inclusive força a instalação de um pacote mais antigo
por cima de um mais novo;
-h: Esta opção mostra o progresso da instalação;
---nodeps: Esta opção desabilita a checagem de dependências para a instalação de
um pacote;
-v: Mostra informações extras durante a instalação e atualização dos pacotes;
-vv: Mostra muito mais informações durante a instalação e atualização dos pacotes.
Geralmente utilizada por desenvolvedores.

As opções de desinstalação dos pacotes são:

--nodeps: Desabilita a checagem de dependências, desinstalando o pacote mesmo


que ele seja necessário por outros;
--test: Testa a remoção do pacote, sem de fato removê-lo. É útil para testar se a
remoção do pacote vai causar algum dano ao sistema ou aplicativo.

Prefira ao atualizar um pacote por uma versão mais nova utilizar o modo –U. Assim o pacote
mais antigo será removido, o pacote novo será instalado e as configurações serão mantidas.

Como você pode ver, o uso do rpm é complicado a primeira vista, e pouco prático, já que o
administrador precisa baixar os pacotes e instalar as dependências de forma manual.

yum
# yum [opções] [comando] [nome do pacote]

Devido a dificuldade de se lidar com gerenciamento de pacotes utilizando o comando rpm, as


distribuições Linux baseadas em Red Hat usam o utilitário yum.

O Yum é um acrônimo para Yellow dog Updater, Modified. É uma ferramenta utilizada para
gerenciar a instalação e remoção de pacotes em distribuições Linux, que utilizam o sistema
RPM.

O Yum é um gerenciador de pacotes de arquivos similar ao APT-GET que lida


automaticamente com dependências computando-as e resolvendo o que deve ser feito para
tratá-las.

Ele possui um arquivo de configuração que especifica quais os repositórios que o YUM deve
utilizar para procurar e baixar os pacotes RPM.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 191


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Nem sempre um Linux baseado em RPM terá o gerenciador de pacotes YUM instalado. Se for
necessário instalar o YUM, ele pode ser conseguido no site http://yum.baseurl.org.

O comando para instalação é:

# rpm -ivh yum.rpm

Repositórios no Yum
O YUM também permite que repositórios de software sejam customizados no arquivo de
configuração yum.conf.

Exemplo do /etc/yum.conf

[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=5
distroverpkg=centos-release

[fedora-us-3-core]
name=Fedora Core 3 — Fedora US mirror
baseurl=http://SERVERNAME/fedora/fedora/$releasever/$basearch/RP
MS.os

[fedora-us-3-updates]
name=Fedora Core 3 Updates — Fedora US mirror
baseurl=http://SERVERNAME/fedora/fedora/$releasever/$basearch/RP
MS.updates

Além do arquivo de configuração /etc/yum.conf, o YUM permite que você coloque arquivos
de configuração de repositórios no diretório /etc/yum.repos.d/. Neste diretório ficam as
configurações de cada repositório.

Os arquivos deste diretório tem a extensão ".repo".

$ ls -l /etc/yum.repos.d/
-rw-r--r--. 1 root root 1664 Ago 13 2018 CentOS-Base.repo

192 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

-rw-r--r--. 1 root root 630 Ago 13 2018 CentOS-Media.repo

Você pode adicionar repositórios extras ou de software em “beta-teste” na lista de


repositórios do YUM.

Um arquivo de repositório geralmente tem um nome e aponta para uma URL na Internet.
Veja o arquivo CentOS-Base.repo:

[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch
=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch
/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

Alguns comandos do yum:

yum list: Lista todos os pacotes disponíveis;


yum check-update ou yum list updates: Verifica se há pacotes disponíveis para
um update;
yum update: Faz o update de seu sistema;
yum install <pacote(s)>: Instala um pacote específico e suas dependências;
yum remove <pacote(s)>: Remove um pacote específico
yum info <pacote>: Apresenta informações básicas de um determinado pacote.
yum whatprovides arquivo: Lista todos os pacotes que possuem o arquivo
indicado na busca

Veja os exemplos:

Para instalar um pacote:

# yum install postgresql

Resolving Dependencies
Install 2 Package(s)
Is this ok [y/N]: y

Package(s) data still to download: 3.0 M


(1/2): postgresql-9.0.4-5.fc15.x86_64.rpm | 2.8 MB
00:11
(2/2): postgresql-libs-9.0.4-5.fc15.x86_64.rpm | 203 kB
00:00

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 193


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

-----------------------------------------------------------------
-
Total 241 kB/s | 3.0 MB
00:12

Running Transaction
Installing : postgresql-libs-9.0.4-5.fc15.x86_64 1/2
Installing : postgresql-9.0.4-5.fc15.x86_64 2/2

Uma opção do Yum é o "-y" que instala ou faz update de pacotes sem perguntar. Não é muito
indicado para produção.

Para fazer update dos pacotes instalados:

# yum update
Plugins carregados: priorities, update-motd, upgrade-helper
amzn-main/latest

Resolvendo dependências
---> Executando verificação da transação
---> O pacote aws-cli.noarch 0:1.7.5-1.2.amzn1 será atualizado
---> O pacote aws-cli.noarch 0:1.7.12-1.3.amzn1 será uma
atualização
---> Resolução de dependências finalizada

Dependências resolvidas
==============================================================
=
Package Arq. Versão Repo
Tam.
==============================================================
=
Instalando:
kernel x86_64 3.14.34-27.48.amzn1 amzn-
updates 16 M

Atualizando:
aws-cli noarch 1.7.12-1.3.amzn1 amzn-
updates 604 k
Resumo da transação
==============================================================
= Instalar 1 Package (+4
Dependent packages)
Upgrade 1 Package
194 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

Tamanho total do download: 16 M


Is this ok [y/d/N]:

Para remover um pacote:

# yum remove postgresql

Para procurar todos os pacotes com a palavra “firefox”:

# yum search firefox


Loaded plugins: langpacks, presto, refresh-packagekit
============== N/S Matched: firefox ======================
firefox.x86_64 : Mozilla Firefox Web browser
gnome-do-plugins-firefox.x86_64 : gnome-do-plugins for firefox
mozilla-firetray-firefox.x86_64 : System tray extension for
firefox
mozilla-adblockplus.noarch : Adblocking extension for Mozilla
Firefox
mozilla-noscript.noarch : JavaScript list extension for Mozilla
Firefox

Name and summary matches only, use “search all” for everything.

Para obter informações sobre um determinado pacote:

# yum info mysql


Plugins carregados: priorities, update-motd, upgrade-helper
newrelic

59/59
Pacotes instalados

Nome : mysql
Arquitetura : noarch
Versão : 5.5
Lançamento : 1.6.amzn1
Tamanho : 0.0
Repo : installed
Do repositório : amzn-main
Sumário : MySQL meta package
URL : http://www.mysql.com
Licença : GPLv2 with exceptions

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 195


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Descrição: MySQL is a multi-user, multi-threaded SQL database


server. MySQL is a
: client/server implementation consisting of a server
daemon (mysqld)
: and many different client programs and libraries. The
base package
: contains the standard MySQL client programs and
generic MySQL files.

Para ver todos os pacotes disponíveis no repositório do yum:

# yum list
Pacotes instalados
GeoIP.x86_64
1.4.8-1.5.amzn1 @amzn-main
GeoIP-devel.x86_64
1.4.8-1.5.amzn1 @amzn-main
PyYAML.x86_64
3.10-3.6.amzn1 installed
acl.x86_64
2.2.49-6.9.amzn1 installed
acpid.x86_64
1.0.10-2.1.6.amzn1 installed
alsa-lib.x86_64
1.0.22-3.9.amzn1 installed
apr.x86_64
1.5.0-2.11.amzn1 @amzn-updates
(…)

Para saber a qual pacote um determinado arquivo pertence:

# yum provides /etc/sysconfig/nfs


Plugins carregados: priorities, update-motd, upgrade-helper
1:nfs-utils-1.2.3-39.15.amzn1.x86_64 : NFS utilities and
supporting clients and daemons for the kernel NFS server

Repo : amzn-main
Resultado a partir de:
Nome de arquivo : /etc/sysconfig/nfs

Para saber quais são os repositórios ativos no YUM:

196 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

# yum repolist
id do repo nome do repo status
amzn-main/latest amzn-main-Base 5.019
amzn-updates/latest amzn-updates-Base 1.085
newrelic/x86_64 New Relic packages 59

dnf
# dnf [opções] [comando] [nome do pacote]

A distribuição Linux Fedora fez o seu próprio gerenciador de pacotes baseado em Red Hat,
chamado DNF.

O DNF é um gerenciador de pacotes de software que instala, atualiza e remove pacotes em


distribuições Linux baseadas em RPM, muito parecido com o YUM.

Ele calcula automaticamente dependências e determina as ações necessárias para instalar


pacotes.

O DNF também facilita a manutenção de grupos de máquinas, eliminando a necessidade de


atualizar manualmente cada uma delas usando rpm.

Introduzido no Fedora 18, é o gerenciador de pacotes padrão desde o Fedora 22.

Para muitos o DNF ou "Dandified Yum" é a versão de próxima geração do Yum.

Ele mantém a compatibilidade da interface do Yum e define uma API rigorosa para extensões
e plugins. O fato dele possibilitar a instalação de plugins é muito bem vinda, pois estes
podem modificar ou ampliar os recursos do DNF e fornecer comandos de interface adicionais.

Se o DNF não estiver instalado na sua distribuição baseado em Red Hat, você pode fazê-lo
usando o Yum:

# yum install dnf

Os comandos que o DNF aceita são bem parecidos com o Yum:

autoremove: remove um pacote e suas dependências (somente se não utilizadas


por outros programas)
check: Verifica o banco de dados RPM e produz informações
check-update [nome do pacote]: Verifica se há atualizações dos pacotes
clean: Apaga os arquivos temporários dos repositórios
distro-sync: Faz upgrade ou downgrade dos pacotes para mantê-los iguais à última
versão do repositório

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 197


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

downgrade [nome do pacote]: faz o downgrade de um pacote


group [info] [install] [list] [remove] [upgrade]: Realiza comandos com grupos
de software
history: lista as transações realizadas
info [nome do pacote]: mostra informações sobre um pacote
install nome_do_pacote: instala um determinado pacote e suas dependências
list: lista os pacotes instalados e disponíveis
provide [nome]: lista os pacotes que contém o nome buscado
remove nome_do_pacote: remove um determinado pacote
repolist: lista os repositórios conhecidos
upgrade [nome do pacote]: faz upgrade de um pacote ou de todos se o nome do
pacote não for especificado

Os exemplos de uso do DNF são muito parecidos com o YUM e a prova requer somente
conhecimento sobre o DNF.

zypper
# zypper [opções_globais] comando [opções_do_comando]
[argumentos]

Assim como o Fedora fez seu próprio gerenciador de pacotes, o OpenSuSE fez o seu
gerenciador chamado Zypper.

O Zypper é um gerenciador de pacotes de linha de comando para instalar, atualizar e


remover pacotes, bem como para gerenciar repositórios.

Os comandos também são parecidos com o YUM.

Para instalar um pacote com o zypper:

# zypper install nome_do_pacote

Algumas opções também requerem um argumento, como o comando search.

O comando a seguir lista todos os padrões conhecidos de uma chave de busca:

# zypper search -t alguma_coisa

Para remover pacotes, use o seguinte comando:

# zypper remove nome_do_pacote


Para atualizar um pacote:
198 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

# zypper update nome_do_pacote

Para atualizar todos os pacotes:

# zypper update

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 199


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Simulado
2.2 Gerenciando Usuários e Grupos e
Arquivos Relacionados

A administração das contas de usuário no Linux é relativamente fácil. As contas de usuário


são gravadas em um arquivo especial chamado /etc/passwd.

/etc/passwd
Neste arquivo são gravados os dados como login do usuário, senha, identificador, grupo a
que ele pertence, nome do usuário, diretório home e shell.

O formato do passwd é:

Login:senha:UID:GID:comentário:home:shell

Cada elemento que constitui o conteúdo do arquivo /etc/passwd é separado por dois-
pontos, na seguinte sequência:

Login: O login é a identificação que o usuário vai utilizar no sistema. Este deve ser único,
sem espaços e geralmente uma abreviação do nome. Algumas aplicações necessitam ter um
usuário próprio que definirá as permissões de segurança;

Senha: O x representa a senha do usuário. Nos primórdios do Linux a senha criptografada


era gravada neste campo no lugar do x. Mas como vários aplicativos e utilitários precisam ter
acesso ao conteúdo do arquivo passwd, ele precisa ter permissões de leitura para todos.
Logo se percebeu que não era muito seguro, e a senha criptografada foi colocada em outro
arquivo especial chamado shadow com permissões de leitura somente para o root. Se a
senha não contiver nenhum caracter (vazio), o login poderá ser permitido sem perguntar
senha;

ID do usuário (User ID – UID): Este ID é numérico único para cada conta de usuário. Por
definição o ID zero (0) é designado para o usuário root, que habilita os seus poderes como
administrador do sistema. Por convenção os IDs de 1 a 99 são utilizados para uso
administrativo e contas de usuário utilizadas por serviços do sistema;

ID do Grupo (Group ID – GID): Este é o ID numérico do grupo ao qual o usuário pertence.


Os usuários podem pertencer a grupos de trabalho para facilitar o compartilhamento de
informações e gerência da segurança do sistema. O Group ID - GID precisa estar cadastrado
no arquivo de controle de grupo /etc/group;

Nome do usuário ou comentário: Este campo alfanumérico aceita espaços e é reservado


para o nome do usuário ou qualquer outra observação pertinente;

Diretório Home: O diretório home é diretório padrão para a conta de usuário. É neste
diretório que o dono da conta tem privilégios especiais. Neste campo do arquivo passwd
200 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

deverá ser colocado o caminho completo do diretório home;

Shell: Neste campo é designado o executável do shell que cada usuário utiliza. O padrão é o
Bourne Again Shell /bin/bash. Outros executáveis podem ser utilizados, como o /bin/sh,
/bin/tcsh ou qualquer outro programa que será executado logo após o processo de logon do
usuário. Existem arquivos especiais como o /bin/false. Este programa simplesmente não faz
nada, proibindo o usuário da conta logar no sistema interativamente. Outra possibilidade é o
arquivo /sbin/nologin. Este programa também não permite que o usuário entre no sistema de
forma interativa, mas exibe uma mensagem que pode ser configurada no arquivo
/etc/nologin.txt

As contas de usuário que contém um falso shell como o /bin/false ou /sbin/nologin


geralmente são usadas como contas especiais, utilizadas por programas, como, por exemplo,
para dar acesso limitado aos arquivos. Por exemplo, o servidor Web Apache utiliza a conta de
usuário "apache" para delimitar em quais arquivos o programa httpd pode ser capaz de
gravar.

Já a conta do superusuário root tem características especiais, como o UserID é zero e grupo
zero. Isso confere à conta superpoderes e acesso ilimitado a todos os recursos do sistema.

Veja um exemplo de contas de usuário no /etc/passwd:

root:x:0:0:root:/root:/bin/bash
apache:x:48:48:Apache:/var/www:/sbin/nologin
openvpn:x:219:497:OpenVPN:/etc/openvpn:/sbin/nologin
zabbix:x:500:501::/home/zabbix:/bin/bash
uira:x:501:501::/home/uira:/bin/bash

/etc/shadow
Antigamente o Linux mantinha as senhas criptografadas no segundo campo do arquivo
/etc/passwd. Como vários programas precisam de acesso às contas do sistema, as senhas
foram movidas para o arquivo /etc/shadow, que não tem permissão de leitura para ninguém.

Além disso, se todos tem acesso ao arquivo com as senhas criptografadas, um ataque do tipo
força bruta pode ser feito, gerando combinações de palavras, números e símbolos que são
criptografados e comparados com as senhas criptografadas, até que uma comparação seja
positiva. Por isso, o fato de apenas o root ter acesso ao /etc/shadow dificulta este ataque.

$ ls -l passwd shadow
-rw-r--r-- 1 root root 1573 out 15 02:12 passwd
---------- 1 root root 760 out 15 02:12 shadow

As senhas no Linux são criptografadas de uma forma que não é possível recuperação usando
a engenharia reversa.

O arquivo /etc/shadow possui a seguinte formatação:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 201


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

root:$1odIUdsnsOIUsd83sHi8JhuE:12422:0:99999:7:::

O primeiro campo do arquivo contém o login do usuário em conformidade com o login no


/etc/passwd.

O segundo campo contém a senha criptografada normalmente com o algoritmo DES. A


senha criptografada com DES terá de 13 a 24 caracteres entre os 64 caracteres alfabéticos -
de a até z, além de 0 a 9, ponto . e barra /. A senha criptografada com DES não contém o
caracter "$".

O Linux permite que outros algoritmos sejam utilizados para criptografar a senha. Caso outro
algoritmo diferente do DES seja utilizado, a senha seguirá o formato $id$salt$hashed.

O $id especifica o algoritmo que foi usado para criptografar a senha, a saber::

$1$ MD5
$2a$ Blowfish
$2y$ Blowfish
$5$ SHA-256
$6$ SHA-512

O $salt é uma string ramdômica de até 16 caracteres para usada para gerar o hash da
criptografia, de forma a criptografia de uma mesma palavra com $salt diferentes resultará
em um hash diferente, que dificulta a força bruta.

O $hashed é a própria senha que foi criptografada usando o algoritmo específico e com um
$salt específico.

Veja a diferença de uma senha criptografada com DES e outra com

carla:KRG3JbnP/pqrhHQO+YgPQaAsXaaeSvLAGGLITWesZHQ=:17388:0:99999:
7:::
uira:$5$MqPxvBfi$ZrPHut.ZofHOV.6eSz3W8G.Iw7FOguMNb9240KnKK8.5KpCQ
Kqn/WSgm/:17998:0:99999:7:::

O terceiro campo contém o número de dias decorridos entre 1 de janeiro de 1970 desde a
última alteração da senha.

O quarto campo contém o número mínimo de dias necessário entre as trocas de senha.

O quinto campo contém o número máximo de dias de validade de uma senha, forçando o
usuário trocar a senha após este número.

O sexto campo contém o número de dias de aviso antes da expiração da senha.

O sétimo campo contém o número de dias que após a expiração desabilita a conta.

O oitavo campo contém o número de dias decorridos entre 1 de janeiro de 1970 e a data em
202 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

que a conta foi desabilitada.

Existem ainda outros 6 campos que configuram as informações de validade da conta e


travamento da conta.

Ainda, o campo de senha pode começar com um ponto de exclamação (!), que significa que
a senha está bloqueada. O travamento da conta pode ser feito manualmente pelo
administrador, adicionando a exclamação no início do campo da senha ou com o comando
passwd.

/etc/group
Para facilitar a administração das permissões de acesso aos recursos e arquivos do sistema,
o Linux faz uso do conceito de grupos de trabalho. Cada usuário faz parte de pelo menos um
grupo de trabalho, definido no /etc/passwd através do campo Group ID.

Os Grupos de Trabalho e seus respectivos Group IDs são definidos no arquivo /etc/group:

nomedogrupo:senha:GID:listademembros

Cada coluna separada por dois pontos do arquivo tem o significado a seguir:

Nome do grupo: O nome do grupo precisa ser único no sistema.

Senha do Grupo: Assim como as contas de usuário, os grupos podem também fazer uso de
senha para que um usuário possa ingressar nele. As senhas de grupo foram criptografadas e
movidas para o arquivo /etc/gshadow. Este campo atualmente contém um "x";

ID do grupo (Group ID ou GID): Cada grupo precisa de um ID numérico inteiro positivo


único. Este ID é referenciado no arquivo /etc/passwd;

Lista de Membros: Os grupos de usuários podem conter um ou mais membros e um


usuário pode ser membro de mais de um grupo. Este campo contém uma lista de logins de
usuários que fazem parte de um grupo.

Algumas distribuições como o Redhat criam um grupo de usuário para cada usuário criado no
sistema. Outras distribuições como o SuSE utilizam o grupo users (GID 100) para todos os
usuários.

Veja um exemplo do /etc/group:

root:x:0:root
daemon:x:10:wwwrun,sendmail,squid
users:x:500:uira,carla

Como o arquivo de /etc/group é de livre leitura, existe a necessidade de separar as senhas de


grupo num arquivo com leitura somente para o superusuário como o /etc/gshadow.

Veja abaixo um exemplo do arquivo /etc/gshadow:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 203


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

root:::root
wwwrun:x::
daemon:x::
diretoria:0f2sdHE83hi237::

Algumas aplicações mantém uma cópia de backup dos arquivos passwd, shadow, gshadow e
group. Este backup é mantido no diretório /etc/ com um traço depois do nome do respectivo
arquivo:

$ ls -l /etc/*-
-rw-r--r--. 1 root root 1111 Oct 15 11:23 /etc/group-
----------. 1 root root 894 Oct 15 11:23 /etc/gshadow-
-rw-r--r--. 1 root root 2604 Oct 15 11:23 /etc/passwd-
----------. 1 root root 1612 Oct 16 22:02 /etc/shadow-

skel

O diretório /etc/skel funciona como um diretório "home" modelo. Quando uma conta de
usuário é criada com o comando useradd, o conteúdo do diretório /etc/skel é copiado para o
diretório HOME do usuário recém criado. Funciona como uma cópia do "profile" no Windows.

Geralmente neste diretório são colocados os scripts de login do bash que podem ser
customizados, assim como subdiretórios e outros arquivos que se deseja que façam parte do
diretório HOME dos usuários quando eles forem criados no sistema.

$ ls -lga /etc/skel/
-rw-r--r-- 1 root 18 jul 27 2018 .bash_logout
-rw-r--r-- 1 root 193 jul 27 2018 .bash_profile
-rw-r--r-- 1 root 231 jul 27 2018 .bashrc

Como os arquivos de contas de usuário e grupos de usuário são arquivos texto, o


gerenciamento de usuários pode ser feito manualmente, editando estes arquivos com um
editor de textos qualquer. Mesmo assim, o Linux não carece de ferramentas para
administração das contas de usuários.

useradd
# useradd [opções] login

204 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

O comando useradd cria contas de usuário no sistema. Seu único parâmetro obrigatório é o
login do usuário.

Se nenhuma opção for fornecida, o comando useradd utilizará as variáveis configuradas no


arquivo /etc/default/useradd. O conteúdo deste arquivo pode variar de acordo com cada
distribuição:

$ cat /etc/default/useradd
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

Se alguma opção for utilizada ao se criar uma conta de usuário com o useradd, ela será
utilizada ao invés da variável correspondente no /etc/default/useradd. As informações deste
arquivo somente serão totalmente ignoradas se todas as opções correspondentes forem
utilizadas ao criar o usuário.

As opções mais frequentes são:

-c “nome do usuário”: Esta opção grava no arquivo passwd o nome do proprietário


da conta ou qualquer outra observação e comentário importantes. É um campo
alfanumérico e deve estar compreendido entre aspas duplas;
-d diretório_home: Esta opção fornece o caminho completo do diretório home do
usuário;
-m: Cria o diretório home fornecido na opção “-d” com os arquivos e estrutura
definidos na configuração de /etc/skel;
-g número_do_grupo: Esta opção fornece o grupo padrão da conta do usuário;
-s shell: Esta opção deve fornecer o caminho completo do shell utilizado pela conta.
Por exemplo /bin/bash, /bin/tcsh, /bin/false etc.

A senha da conta deverá ser configurada depois de criada a conta o com o comando passwd.

Exemplos:

# useradd –d /home/uira –m –c “Uirá Ribeiro” –s /bin/bash –g 100


uira

No exemplo o useradd cria o usuário uira com o diretório home /home/uira com a estrutura
definida em /etc/skel, com o nome “Uirá Ribeiro” nos comentários, com o shell /bin/bash
e o grupo GID 100.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 205


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Um usuário pode ser criado simplesmente com o comando abaixo, informando apenas o
login. Neste caso as opções do /etc/default/useradd foram usadas para configurar a conta de
usuário

# useradd arthur

# cat /etc/passwd|grep arthur


arthur:x:1005:100::/home/arthur:/bin/bash

Uma vez criada a conta de usuário, os dados podem ser alterados manualmente, editando o
arquivo /etc/passwd, ou utilizando o comando usermod.

usermod
# usermod [opções] login

O comando usermod modifica as configurações de uma determinada conta de usuário.

Ele aceita as seguintes opções:

-d diretório_home: Esta opção fornece o caminho completo do diretório home do


usuário;
-c “nome do usuário”: Esta opção grava no arquivo passwd o nome do proprietário
da conta ou qualquer outra observação e comentário importantes;
-g número_do_grupo: Esta opção fornece o grupo padrão da conta do usuário;
-s shell: Esta opção deve fornecer o caminho completo do shell utilizado pela conta.
Por exemplo /bin/bash, /bin/tcsh, /bin/false, etc;
-L: Trava a conta de usuário adicionando o sinal “!” na senha;
-U: Destrava a conta do usuário, removendo o sinal “!” da senha.
-e 2019-12-31: Indica que a conta deverá ser desativada no dia 31 de dezembro de
2019. O formato deve ser AAAA-MM-DD.

Exemplos:

Altera o comentário, com nome do usuário Arthur:

# usermod –c “Arthur Ribeiro” arthur

Trava a conta do usuário analima no sistema não permitindo mais o logon:

# usermod –L analima

206 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Expira a conta do usuário arthur em 31 de outubro de 2019:

# usermod -e 2019-10-31 arthur

Você pode confirmar a data de validade de uma conta com o comando chage com a opção "-
l":

# chage -l arthur
Last password change : Oct 17,
2019
Password expires : never
Password inactive : never
Account expires : Oct 31,
2019
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

userdel
# userdel [opção] login

O comando userdel remove a conta de um determinado usuário do sistema. Ele remove a


conta dos arquivos /etc/passwd, /etc/shadow e /etc/group.

A opção disponível é:

-r: Remove o diretório home do usuário junto com a sua conta.


-f: Força a remoção do usuário mesmo que ele esteja logado

Exemplo:

# userdel –r arthur

passwd
# passwd [opção] login

O comando passwd entra com a senha para uma determinada conta de usuário. Se a conta

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 207


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

de usuário não for fornecida como parâmetro o passwd muda a senha da conta utilizada no
momento. Por questões de segurança não é possível passar a senha na linha de comando.

A opção disponível é:

-l: Esta opção tranca a conta do usuário adicionando o sinal “!” no Debian, ou o sinal
“!!” no Redhat, no campo senha do arquivo /etc/shadow, de forma que a string de
senha não seja mais aceita. É importante dizer que, se o usuário utilizar outro método
de autenticação que não precise de senha, como por exemplo uma chave SSH, ele
ainda irá logar no sistema. Para trancar definitivamente um usuário é indicado usar o
comando “usermod –e” para indicar que sua conta venceu.
-u: Esta opção faz o reverso da opção "-l", retirando a exclamação "!" e
desbloqueando a senha.
-d: Esta opção apaga a senha da conta, deixando a conta sem senha.
-e: Esta opção força a expiração da senha, forçando o usuário a trocar de senha no
próximo login.
-n z: Esta opção configura o mínimo de Z dias de vida para uma senha.
-x z: Esta opção configura o máximo de Z dias de vida para uma senha.
-w z: Esta opção configura o numero de Z dias de vida para uma senha.
-i z: Esta opção configura o número Z dias entre a senha estar expirada e a conta
ficar inativa.
-S: Esta opção mostra informações do status da conta.

Somente o root pode alterar a senha de outros usuários. Um usuário comum pode executar o
passwd para alterar a sua própria senha.

Para mudar a senha do usuário uira:

# passwd uira
Enter new password for ‘uira’:

Para ver o status da senha de um usuário:

# passwd -S uira
uira PS 2019-04-11 0 99999 7 -1 (Password set, SHA512 crypt.)

Para bloquear uma conta de usuário:

# passwd -l uira
Locking password for user uira.
passwd: Success

208 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Veja que o status da conta bloqueada passa a ser "LK":

# passwd -S uira
uira LK 2019-04-11 0 99999 7 -1 (Password locked.)

Desta forma, a senha no arquivo /etc/shadow ganhou dois asteriscos "!!":

# cat /etc/shadow|grep uira


uira:!!$6$MqPxvBfi$ZiKAPicCjTbCvLrPHut.ZeSmqVVlHsZJmHtJWofHOV.6eS
z3W8G.Iw7FOguMNb9240KnKK8.5KpCQKqn/WSgm/:17998:0:99999:7:::

Para desbloquear uma senha:

# passwd -u uira
Unlocking password for user uira.
passwd: Success

Agora o status voltou a ser "PS":

# passwd -S uira
uira PS 2019-04-11 0 99999 7 -1 (Password set, SHA512 crypt.)

Para configurar uma senha para expirar em 30 dias:

# passwd -x 30 uira
Adjusting aging data for user uira.
passwd: Success

Veja que a expiração da senha passou para 30 dias:

# passwd -S uira
uira PS 2019-04-11 0 30 7 -1 (Password set, SHA512 crypt.)

chage
# chage [opções] login

O comando chage lida com a expiração das contas de usuário.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 209


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

As expirações são gravadas no arquivo /etc/shadow.

Suas opções são:

-E data: Informa a data de expiração no formato ano, mês e dia

(AAAA-MM-DD). Se for informado “-1” (menos 1), irá remover a data de validade da conta.

-l: Lista as configurações da conta do usuário. Esta opção pode ser utilizada por
qualquer usuário.
-d N ou AAAA-MM-DD: Configura o número N de dias da última modificação de
senha desde 01/01/1970. Também aceita uma data no formato AAAA-MM-DD.
-E N ou AAAA-MM-DD: Configura número N de dias em que a conta será
desabilitada desde 01/01/1970. Também aceita uma data no formato AAAA-MM-DD.
-I N: Configura o número N de dias de inatividade após a expiração da senha em que
a conta será desabilitada.
-m N: Configura o número N mínimo de dias de validade de uma senha. Um valor
zero permite que o usuário troque de senha a qualquer hora.
-M N: Configura o número N máximo de dias de validade de uma senha, forçando o
usuário a troca-la.
-W N: Configura o número N de dias em que um aviso será dado ao usuário antes da
troca da senha.

As definições de parâmetros padrão das contas de usuário estão no arquivo /etc/login.defs

Exemplo:

# chage –E 2016-05-23 cristiane

O comando chage também pode operar de forma interativa, apenas informando a conta do
usuário sem nenhuma opção:

# chage arthur
Changing the aging information for arthur
Enter the new value, or press ENTER for the default
Minimum Password Age [0]: 10
Maximum Password Age [99999]: 60
Last Password Change (YYYY-MM-DD) [2019-10-17]:
Password Expiration Warning [7]: 7
Password Inactive [-1]: 10
Account Expiration Date (YYYY-MM-DD) [2019-10-31]:
2019-10-31

As informações de expiração da conta podem ser visualizadas com a opção "-l" do comando.

210 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

groupadd
# groupadd nome_do_grupo

O comando groupadd cria um novo grupo de usuários.

Este comando grava informações nos arquivos /etc/group e /etc/gshadow.

As opções mais comuns são:

-f: Força a saída do comando como sucesso mesmo que o nome do grupo ou groupid
já existam;
-g N: Atribui o número N ao Group ID;
-p SENHA: atribui uma senha à um grupo, de forma que um usuário deve saber a
senha para ingressar em um grupo

Exemplos:

Para criar um grupo chamado contabilidade:

# groupadd contabilidade

# cat /etc/group|grep contabilidade


contabilidade:x:1006:

groupdel
# groupdel nome_do_grupo

Este comando apaga um grupo do sistema.

O comando groupdel modifica os arquivos de contas do sistema, apagando todas as


referências ao grupo. O grupo a ser apagado deve existir.

Deve-se manualmente checar os sistemas de arquivos para garantir que nenhum dos
arquivos permanece com o grupo ou com a sua identificação.

# groupdel contabilidade

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 211


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

groupmod
# groupmod [opção] nome_do_grupo

O comando groupmod modifica as configurações de um grupo.

Obrigatoriamente pelo menos uma das opções deve ser escolhida:

-g X Altera o Group ID do grupo para X. Este valor deve ser numérico positivo.
Tipicamente os valores de 0 a 999 são reservados para grupos de sistema.
-n nome Altera o grupo para o nome especificado.

Exemplo:

Muda o nome do grupo de Marketing para Vendas:

# groupmod -n vendas marketing

getent
$ getent base [chave de busca]

O comando getent é utilizado para acessar as bases de dados de contas de usuário, senhas e
grupos de usuários.

Apenas as bases de dados configuradas no arquivo /etc/nsswitch.conf podem ser acessadas


com este comando.

A sintaxe do comando é:

$ getent base_de_dados chave

A base de dados pode assumir os seguintes valores:

passwd: refere-se ao arquivo /etc/passwd;


shadow: refere-se ao arquivo /etc/shadow;
group: refere-se ao arquivo /etc/group;

A chave é o item em que você deseja informações da base de dados.

Veja o exemplo, mostra os dados da conta de usuário zabbix:

212 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

$ getent passwd zabbix


zabbix:x:500:501::/home/zabbix:/bin/bash

Somente o root pode ter acesso a base de dados shadow:

# getent shadow zabbix


zabbix:$6$..5pDu8/$SBoEjzWpYE3hRNhoPI8pJW5rPpM2eEqc3OyWgAqFAJWJsa
Oy
xqMGs9BylcNiTKk.su.OQCuSEWRUEPoAuZFq0.:16537:0:99999:7::16509:

O comando getnet é útil para pegar os dados de uma determinada conta de usuário ou
grupo, sem precisar listar o conteúdo dos arquivos passwd, shadow ou group e filtrar os
resultados com com o grep.

Gerenciamento de Senhas

O Linux suporta que as senhas dos usuários possam ter data de expiração.

Quando uma conta de usuário é criada com o comando useradd, o Linux verifica se há
cadastrado uma data de expiração da senha no arquivo /etc/default/useradd, buscando a tag
EXPIRE:

$ cat /etc/default/useradd
SHELL=/bin/sh
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

Se houver um valor para esta variável, será configurado para a nova conta uma data de
expiração da senha, forçando o usuário a troca-la dentro do prazo.

Mas, uma vez que as contas de usuário já estão criadas, o comando para visualizar e alterar
as datas de expiração das senhas é o chage, já abordado no tópico de gerenciamento de
contas de usuário.

Para alterar uma data de expiração de senha, pode-se usar a opção -M seguido do número de
dias em que aquela senha é válida:

# chage -M 180 uiraribeiro


Para visualizar a expiração da senha de um usuário:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 213


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

$ chage -l uiraribeiro
Last password change : Apr 23,
2019
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

Um usuário pode alterar sua senha a qualquer momento com o comando passwd:

$ passwd
Current password:
New password:

Somente o root pode alterar a senha de outros usuários com o comando passwd seguido da
conta do usuário:

# passwd carla

Identificando Qual Usuário Está


Conectado ou Última Conexão

last

O utilitário last, fornece as últimas conexões efetuadas no sistema e por qual usuário:

$ last
ec2-user pts/0 ip-10-8-0-6.ec2. Tue Apr 14 10:21 still
logged in
ec2-user pts/0 ip-10-8-0-6.ec2. Mon Apr 13 23:26 - 00:10
(00:43)
ec2-user pts/5 ip-10-8-0-6.ec2. Sun Apr 12 15:52 - 01:50
(09:57)
ec2-user pts/0 ip-10-8-0-6.ec2. Sun Apr 12 15:51 - 01:50
(09:59)

214 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

id

O comando id mostra qual é o usuário efetivo e qual é o usuário real no Linux.

Exemplo:

$ id
uid=1000(uiraribeiro) gid=1000(uiraribeiro)
groups=1000(uiraribeiro),4(adm),24(cdrom),27(sudo),30(dip),46(plu
gdev),119(lpadmin),130(lxd),131(sambashare)

Observe que o usuário que está logado no Linux é o uiraribeiro, com User ID iqual a 1000. O
comando também mostra todos os grupos que o usuário faz parte.

Com a opção "-un" o comando id mostra o User Name (login) do usuário:

$ id -un
uiraribeiro

Com a opção "-u" o id mostra o User ID do usuário.

uiraribeiro@ubuntu:~$ id -u
1000

O comando id também pode mostrar informações de um determinado usuário, quando o


login for informado como parâmetro:

$ id arthur
uid=1001(arthur) gid=1001(arthur) groups=1001(arthur)

Este comando geralmente é útil para ser utilizado em scripts, onde se deseja pegar o login ou
User Id do usuário.

whoami

Este comando mostra qual é o login do usuário corrente. É o mesmo que o comando "id -un".

$ whoami
uiraribeiro

$ id -un

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 215


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

uiraribeiro

who
$ who

O utilitário who pode ser utilizado para mostrar quais são os usuários logados no sistema:

$ who
ec2-user pts/0 2015-04-14 10:21 (ip-10-8-0-6.ec2.internal)

w
$w

O utilitário w também fornece uma lista de quais usuários estão conectados, mas com outros
detalhes:

$ w
12:10:53 up 218 days, 22:52, 1 user, load average: 0,00, 0,01,
0,05
USER TTY FROM LOGIN@ IDLE JCPU PCPU
WHAT
ec2-user pts/0 ip-10-8-0-6.ec2. 10:21 5.00s 0.45s 0.00s w

O comando "w" exibe qual o comando ou programa os usuários estão executando no


momento, bem como a média de uso de CPU em 1, 5 e 15 minutos.

Arquivos de Configuração do Bash e


Perfil

O bash possibilita que as funções, variáveis e apelidos possam ser gravados em alguns
arquivos para que possam ser carregados novamente quando o sistema for iniciado
novamente, ou uma nova execução do bash for feita.

Os arquivos lidos pelo bash são:

216 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

/etc/profile

Arquivo global de configuração de Perfil de todos os usuários. Define variáveis globais e é


executado durante o processo de autenticação do usuário. Este script também costuma
carregar com o comando source os arquivos contidos no diretório /etc/profile.d.

/etc/profile.d

Este diretório contém um ou mais scripts que são carregados pelo /etc/profile.

$ ls -l /etc/profile.d
-rw-r--r-- 1 root root 1606 jul 31 2018 colorls.sh
-rw-r--r-- 1 root root 2703 ago 2 2018 lang.sh
-rw-r--r-- 1 root root 121 jul 31 2018 less.sh
-rw-r--r-- 1 root root 248 jul 17 14:46 vim.sh

/etc/bashrc ou /etc/bash.bashrc

Arquivo global de configuração de Perfil, que define variáveis importantes e é executado toda
vez que o Bash é carregado. Em algumas distribuições aparece com o nome /etc/bashrc e em
outras como /etc/bash.bashrc.

~/.bash_profile

Arquivo de Perfil individual de cada usuário que é executado logo imediatamente ao


/etc/profile. Seu conteúdo é lido a cada execução do Bash e cada usuário tem o seu no
diretório HOME.

~/.bash_login

Se o arquivo ~/.bash_profile não existir, ele é executado logo após o processo de logon. Cada
usuário tem o seu;

~/.profile

Se os arquivos .bash_profile e .bash_login não existirem, ele é executado logo após o logon.
Cada usuário tem o seu;

~/.bashrc

É executado automaticamente quando o processo Bash é iniciado. Cada usuário tem o seu;

~/.bash_logout

É executado durante o processo de logout;

Relembrando que o “~/” indica o diretório HOME do usuário logado.

Convém você olhar estes arquivos e analisar o seu conteúdo. Cada distribuição pode; variar o
conteúdo destes scripts. Você pode até notar que um script chama o outro.

É muito importante saber a função e quando cada arquivo é executado. De maneira geral,

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 217


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

guarde que:

Os arquivos que ficam no diretório /etc são Globais, e valem para todos os usuários;
Os arquivos quem ficam no diretório HOME, são individuais para cada usuário;
Os arquivos que tem profile no nome, são carregados no processo de login, uma
única vez;
Os arquivos que tem bash no nome são carregados toda vez que o Bash é
executado.

Outro detalhe importante é que estes arquivos são lidos e executados na ordem descrita
acima: primeiro os Profiles, depois os Bash. Nem todas as distribuições fazem uso de todos
esses arquivos.

A figura 15 ilustra o ordem do processo de carga destes scripts:

218 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Figura 15 - Scripts de Login

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 219


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Observe que os nós em amarelo são scripts globais, que valem para todos os usuários. O
scripts ~/.bashrc é carregado toda vez que o Bash é executado. E o script ~/.bash_logout
toda vez que o Bash termina.

Ajustando o Ambiente de Trabalho dos


Usuários

Durante o processo de logon de um usuário, quando o shell bash inicia, ele executa o script
/etc/profile. Este script pode ser customizado e diferente em cada distribuição Linux. Sua
função é configurar algumas variáveis de ambiente e fazer a sintonia do sistema para os
usuários.

O Bash também procura pelo arquivo /etc/bash.bashrc que também tem uma função
parecida com o profile, mas o bashrc é executado todas as vezes que o bash é executado.

Cada usuário também pode criar seus scripts de inicialização para serem executados durante
o logon. Estes arquivos precisam estar localizados no diretório home dos usuários com os
nomes:

.profile
.bash_profile
.bash_login
.bashrc
.bash_logout

O ponto “.” antes do nome do arquivo confere a ele o atributo de escondido, somente sendo
listado com o comando “ls –lga”.

Trabalhando com Cotas

No Linux existe a possibilidade de habilitarmos cotas de usuário e grupos para gerenciarmos


melhor o uso do espaço disponível em disco. Este recurso é especialmente importante em
ambientes multiusuários, servidores de Web, servidores de arquivos, servidores de e-mail,
etc.

No gerenciamento de cotas é possível definirmos a quantidade de espaço em disco para cada


usuário ou grupo de usuários.

É preciso habilitar o gerenciamento de cotas antes de utilizarmos este recurso.

Veja os passos a seguir:

1) Talvez seja preciso instalar o pacote de cotas com o comando:

220 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

No Debian:

# apt update
# apt install quota

No Redhat:

# yum install quota

2) Depois é preciso editar o arquivo /etc/fstab e adicionar o gerenciamento de cota para


usuário (usrquota) e para grupo (grpquota) no dispositivo desejado:

# vi /etc/fstab

/dev/hda6 /home ext2 defaults,usrquota,grpquota 1


2

3) Crie o arquivo aquota.user e aquota.group no diretório /home com o comando


“quotacheck –cug” e configure as permissões de leitura e escrita somente para o superu-
suário. Os nomes de arquivos aquota.user e aquota.group são da versão 2 do pacote quota.

Na versão 1 do pacote de cotas estes arquivos têm os nomes quota.user e quota.group.

Se você não sabe qual versão está instalada, o melhor é usar o comando "quotacheck -
cug", uma vez que ele se encarrega de criar os arquivos com o nome correto.

O comando quotacheck vai varrer o arquivo /etc/fstab e criar estes arquivos na raiz do
ponto de montagem de todos os dispositivos que foram assinalados com os flags usrquota e
grpquota.

Para criar os dois arquivos serão os bancos de dados para as cotas de usuário e grupo:

# quotacheck -cug

Ou se preferir criar manualmente os arquivos de cotas e altere as permissões:

# touch /home/aquota.user
# touch /home/aquota.group
# chmod 600 /home/aquota.user
# chmod 600 /home/aquota.group

4) Execute o comando quotacheck –avug para iniciar o banco de dados recém-criado:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 221


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

# quotacheck –avug

5) Verifique se o banco de dados foi iniciado. Os arquivos aquota.user e aquota.group não


devem ter tamanho zero:

# ls –lga /home

6) Habilite o serviço de cotas:

# quotaon -a

7) Tenha certeza de que o serviço de cotas é habilitado no boot. Se não existir o arquivo
/etc/rc.d/quotas, crie um arquivo de script:

# vi /etc/rc.d/quotas

#!/bin/bash
/sbin/quotaon –avug

Altere as permissões para 755:

# chmod 755 /etc/rc.d/quotas

Crie o link simbólico para o arquivo de cotas para o runlevel 3 e runlevel 5:

# ln –s /etc/rc.d/quotas /etc/rc.d/rc3.d/S20quotas
# ln –s /etc/rc.d/quotas /etc/rc.d/rc5.d/S20quotas

8) Faça checagem do sistema de cotas uma vez por semana colocando o comando
quotacheck no cron do root:

# crontab –e

0 3 * * 0 /sbin/quotacheck –avug

Uma vez feitos estes passos, o sistema de cotas poderá ser utilizado.

Tipos de Limite de Cota


Existem quatro tipos de limites de cotas a saber:
222 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

Limite Físico por Usuário (user hard limit): O limite físico é a quantidade total de
espaço em disco que um usuário pode ter. O usuário não poderá gravar mais nada
quando este limite for alcançado;
Limite Leve por Usuário (user soft limits): O limite leve funciona como uma área
de aviso. Quando este limite é atingido o sistema avisa o usuário que seu espaço em
disco está acabando. O usuário poderá fazer gravações em disco até que o limite
físico seja alcançado;
Limite Físico por Grupo (group hard limit): O limite físico por grupo define o
máximo de espaço em disco que um grupo de usuários possa ter. Se este limite for
alcançado, os usuários do grupo não poderão mais efetuar gravações mesmo que
haja espaço disponível para um determinado usuário;
Limite Leve por Grupo (group soft limit): Tem o mesmo conceito do limite físico
por grupo, mas funciona como uma área de aviso.

Período de Graça
Ainda podemos configurar no gerenciamento de cotas um Período de Graça (grace period)
para que um usuário ou grupo que tenha atingido o limite leve possa apagar alguns arquivos
e ficar dentro do estabelecido.

Depois que o tempo especificado no período de graça for ultrapassado e nenhuma ação for
tomada, o limite leve passa a ser limite físico, impossibilitando os usuários de trabalharem
até que a situação seja de fato resolvida. Este limite pode ser em minutos, horas, dias,
semanas e até meses.

Gerenciamento de Cotas
Vejamos agora os comandos para gerência de cotas:

quota
# quota [opções] usuário/grupo

O comando quota mostra as cotas de espaço em disco configuradas para um determinado


usuário ou grupo e o espaço utilizado.

Suas opções mais frequentes são:

-u: Mostra a cota definida para um determinado usuário (padrão);


-g: Mostra a cota definida para um determinado grupo;
-q: Mostra somente quando a cota for excedida;
-v: Mostra as cotas mesmo que nenhuma esteja definida.

Exemplo:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 223


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

# quota –v uira
Disk quota for user uira (uid 502):
Filesystem blks quota limit grace
files quota limit grace
/dev/hda6 18320 19000 20000 58
0 0

Neste exemplo o usuário uira está usando 18320 blocos. O limite leve são 19000 blocos e o
limite físico são 20000 blocos.

Somente o superusuário pode ver a cota de outros usuários. Um usuário comum pode ver a
sua própria cota e a cota do grupo de que é membro.

quotaon
# quotaon [opções] [dispositivos]

O comando quotaon habilita o gerenciamento de cotas em um dispositivo previamente


configurado.

As opções mais frequentes são:

-a: Habilita o gerenciamento de cotas para todos os dispositivos configurados para


controle de cotas no arquivo /etc/fstab;
-g: Habilita o gerenciamento de cotas para grupos em um determinado dispositivo;
-u: Habilita o gerenciamento de cotas para usuários em um determinado dispositivo;
-v: Mostra todos os dispositivos onde o gerenciamento de cotas foi habilitado.

Exemplo:

# quotaon –avug

Habilita cotas de usuários e grupos para todos os dispositivos configurados para tal em
/etc/fstab.

quotaoff
# quotaoff [opções] [dispositivos]

Este comando desabilita o gerenciamento de cotas em determinados dispositivos.

As opções deste comando são semelhantes ao comando quotaon.

Exemplo:
224 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

# quotaoff –gu /dev/hda6

quotacheck
# quotacheck [opções] [dispositivo]

Este comando faz uma varredura em um determinado dispositivo e constrói os arquivos de


banco de dados de cotas. É importante que este comando seja executado com certa
regularidade para que o banco de cotas esteja fiel à realidade do sistema de arquivos.

As opções deste comando são:

-a: Faz a varredura de todos os dispositivos configurados para o gerenciamento de


cotas no arquivo /etc/fstab e constrói a base de dados para usuários e grupos;
-g grupo: Constrói a base de dados de cotas para um determinado grupo;
-u usuário: Constrói a base de dados de cotas para um determinado usuário;
-v: Mostra todos os procedimentos executados pelo quotacheck.

Exemplo:

# quotaoff –a
# quotacheck –aug
# quotaon

Se você não desabilitar as cotas para um determinado dispositivo ao executar o comando


quotacheck, as informações coletadas ficarão em memória, mas os arquivos com a base de
dados não serão atualizados.

edquota
# edquota [opções] usuário/grupo

Este comando edquota edita cotas para usuários e grupos. Ele utiliza o editor de texto vi ou
outro editor de textos padrão para configurar as cotas de disco. O arquivo de configuração de
cotas poderá parecer um pouco estranho, mas sua configuração é simples.

As opções disponíveis para o comando são:

-g: Se a opção –g for especificada, o edquotas deverá receber como parâmetro o


nome do grupo;
-u: Esta é a opção padrão, para editar as cotas do usuário;
-p: usuário: Esta opção é chamada de proto-usuário. Você pode utilizar esta opção

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 225


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

para copiar as configurações de um usuário padrão para um outro usuário;


-t: Esta opção é para configurar o período de graça para os usuários ou determinado
grupo. Deve ser combinada com a opção –u ou –g.

Exemplo:

# edquota –u uira
Quotas for user: uira
/dev/hda6: blocks in use: 136, limits (soft = 19000, hard =
20000)
Inodes in use: 132, limits (soft = 0, hard = 0)

Neste exemplo o limite leve (soft) são 19000 blocos e o limite físico (hard) são 20000.

# edquota –tu
Time units may be: days, hours, minutes, or seconds
Grace period before enforcing soft limits for users:
/dev/hda6: block grace period: 15 days.
File grace period: 7 days

Neste exemplo o período de graça são 15 dias para blocos e 7 dias para arquivos (inodes).

repquota
# repquota [opções] dispositivo

Este comando cria um relatório das cotas e utilização do disco dos usuários de um
determinado dispositivo ou grupo.

As opções deste comando são:

-a: Cria um relatório de cotas para todos os dispositivos configurados para


gerenciamento de cotas no arquivo /etc/fstab;
-u: Esta é a opção padrão, que cria um relatório de utilização por usuários;
-g: Esta opção reporta a utilização de cotas por grupo;
-v: Cria um cabeçalho descritivo para o relatório.

Exemplo:

# repquota –va
*** Report for user quotas on /dev/hda6 (/home)
Block limits File limits

226 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

User used soft hard grace used


soft hard grace
root 718000 0 0 418 0
0

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 227


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Simulado
2.3 Crie, modifique e redirecione
arquivos

Este capítulo aborda os dois editores de texto clássicos do Linux, como vi e nano, os
conceitos de entrada e saída de dados, os redirecionadores de fluxo de texto, os comandos
de filtros de texto, criação de links e como localizar arquivos no sistema.

Editor de Textos vi/vim


$ vi [opções] arquivo

O vi é um editor de textos ASCII poderoso e muito usado na interface de caractere do Linux


para edição de arquivos e programas. Seu uso não é muito intuitivo à primeira vista, mas a
edição simples de textos pode ser feita usando poucos comandos.

Basicamente ele tem dois modos de trabalho: o modo de operação e o modo de inserção. No
modo de operação o vi espera comandos que vão realizar alguma ação. No modo de
inserção, tudo que for digitado é considerado texto.

Figura 16 - Vi

O modo de operação é acessado através da tecla ESC. O vi sempre inicia nesse modo. Para
entrar no modo de inserção, basta a pressionar a tecla INSERT ou o comando “i”.

Para fazer a edição simples de arquivos no vi:


228 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

$ vi nomedoarquivo

Altere o modo para inserção com a tecla INSERT. O cursor pode ser movido neste modo com
as setas de posição. Ao terminar a digitação aperte a tecla ESC e digite:

:w para salvar as modificações;


:wq para salvar e sair do vi;
:q! para sair sem salvar;

Veja a seguir a tabela de comandos aceitos pelo vi. Todos os comandos deverão ser dados no
modo de operação. O sinal “+” indica teclas que devem ser pressionadas simultaneamente.
A vírgula indica que as teclas devem ser digitadas em sequência.

Ação Comando

Abrir Arquivo :e arquivo

Salvar Arquivo :w

Salvar Arquivo Como :w arquivo

Salvar e Sair :wq

Sair sem salvar :q!

Gravar conteúdo se alterado :ZZ

Para marcar um texto para cópia ou corte v, setas de direção

Para copiar texto marcado y

Para cortar texto marcado c

Para colar texto marcado p

Copiar uma linha yy

Copiar até o final do arquivo yG

Apagar texto à frente (DEL) x

Apagar texto para trás (BACKSPACE) X

Apagar uma linha dd

Apagar até o final do arquivo dG

Apagar até o final da linha D

Localizar texto à frente /texto

Localizar novamente /

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 229


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Ação Comando

Localizar texto para trás ?texto

Localizar novamente ?

Desfazer alterações u

Refazer alterações CTRL+r

Formatar Alinhamento Centralizado :ce

Alinhamento à direta :ri

Alinhamento à esquerda :le

Abrir nova janela :new

Dividir a janela atual em duas :split

Abrir arquivo em nova janela :split arquivo

Ir para janela de cima CTRL+w, k

Ir para janela de baixo CTRL+w, j

Ir para o início da linha 0

Ir para o final da linha $

Ir para o final do arquivo G

Ir para a linha de baixo j

Ir para a linha de cima k

Ir para a esquerda h

Ir para a direita l

Ir para o final da tela L

Ajuda :help

Insere texto antes do cursor i

Insere texto depois do cursor a

Insere texto em uma nova linha o

nano
$ nano arquivo

Outro editor muito utilizado no Linux, principalmente para iniciantes, é o nano. Ele lembra um
230 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

pouco o bloco de notas do Windows, mas para terminal do Linux.

O nano é um editor pequeno e amigável. Ele não tem modo de comando. Tudo é simples
como editar textos no Bloco de Notas do Windows.

Para executar o nano:

$ nano arquivo

Os comandos do nano são bem simples, e podem ser acionados com a tecla Control mais a
letra correspondente.

Figura 17 - Nano

Processando fluxos de texto usando


filtros

O Linux tem diversas ferramentas para trabalhar e transformar fluxos de texto ou arquivos
de textos (sem formatação especial). Estas ferramentas são úteis para criar scripts no shell,
verificar arquivos de log, ordenar, retirar textos duplicados, dividir em arquivos menores,
etc.

Para um usuário de Windows essas ferramentas parecem um pouco esquisitas e ortodoxas,


mas você tem de lembrar que elas foram criadas no contexto do Unix nos anos 70, e são tão
úteis até hoje.

Algumas destas ferramentas possibilitam que se busque por textos seguindo padrões de
busca conhecidos como expressões regulares. Apesar de não se tratar de um tópico
específico da prova, o seu entendimento para usar profissionalmente essas ferramentas de
busca de texto é essencial.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 231


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Procurar por Arquivos Texto Usando


Expressões Regulares

Uma expressão regular é um método formal de se especificar um padrão de texto a ser


procurado em um ou mais arquivos. É uma composição de caracteres com funções especiais
(metacaracteres) que agrupados entre si com caracteres literais (de A a Z) e números podem
formar uma sequência, uma expressão que o shell e editores de texto podem entender e
buscar.

As expressões regulares são úteis para buscar ou validar textos variáveis como:

Número de endereço IP;


Endereço de e-mail;
Endereço de Internet (URL);
Dados na coluna em um texto;
Dados que estão entre <tags></tags> de uma linguagem, como o HTML;
Número de CNPJ, RG, CPF etc.;
Data e Horário.

Vários editores de texto e linguagens de programação oferecem suporte a expressões


regulares. As ferramentas importantes que trabalham com este recurso para o exame são o
grep e suas variações e o sed.

Conceitos Básicos
Uma expressão regular (ou, um padrão) descreve um conjunto de cadeias de caracteres, de
forma concisa, sem precisar listar todos os elementos do conjunto.

Por exemplo, um conjunto contendo as cadeias "Handel", "Händel" e "Haendel" pode ser
descrito pelo padrão H(ä|ae?)ndel.

Alternância

Uma barra vertical (|) separa alternativas.

Por exemplo, psicadélico|psicodélico pode casar "psicadélico" ou "psicodélico".

Agrupamento

Parênteses ((, )) são usados para definir o escopo e a precedência de operadores, entre
outros usos.

Por exemplo, psicadélico|psicodélico e psic(a|o)délico são equivalentes e ambas descrevem


"psicadélico" e "psicodélico".

Quantificação (ou repetição)

232 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Um quantificador após um token (como um caractere) ou agrupamento especifica a


quantidade de vezes que o elemento precedente pode ocorrer. Os quantificadores mais
comuns são o ponto de interrogação ?, o asterisco * e o sinal de adição +.

? indica que há zero ou uma ocorrência do elemento precedente. Por exemplo,


ac?ção casa tanto "acção" quanto "ação".
* indica que há zero ou mais ocorrências do elemento precedente. Por exemplo, ab*c
casa "ac", "abc", "abbc", "abbbc", e assim por diante.
+ indica que há uma ou mais ocorrências do elemento precedente. Por exemplo,
ab+c casa "abc", "abbc", "abbbc", e assim por diante, mas não "ac".

Essas construções podem ser combinadas arbitrariamente para formar expressões


complexas, assim como expressões aritméticas com números e operações de adição,
subtração, multiplicação e divisão. De forma geral, há diversas expressões regulares para
descrever um mesmo conjunto de cadeias de caracteres. A sintaxe exata da expressão
regular e os operadores disponíveis variam entre as implementações.

POSIX
De 1986, a norma IEEE POSIX 1003.2 (POSIX.2) padroniza expressões regulares, e fornece
duas especificações, a saber:

o conjunto básico (BRE) e


o conjunto estendido (ERE).

BRE: expressões regulares básicas

A sintaxe tradicional de expressões regulares em Unix seguiu convenções comuns, mas


diferiu entre as implementações. A norma IEEE POSIX BRE (Basic Regular Expressions, do
inglês, expressões regulares básicas) foi desenvolvida primordialmente por compatibilidade
com a sintaxe tradicional, mas fornecia uma norma comum que desde então foi adotada por
diversas ferramentas.

Na sintaxe de BRE, a maioria dos caracteres são tratados como literais — eles casam
somente com eles próprios (por exemplo, a casa "a"). As exceções são chamadas
metacaracteres ou metassequências, definidos abaixo:

Metacaractere Descrição

. Representa qualquer caractere. Algumas implementações excluem quebra de linha e


codificação de caracteres. Nas expressões POSIX de listas de caracteres (ver logo abaixo),
o caractere ponto é tratado como o literal. Por exemplo, a.c pode encontrar "abc", etc., mas
[a.c] encontra somente "a", "." ou "c".

[ ] As chaves representam lista de caracteres. Serve para encontrar uma ocorrência de


qualquer caracteres contido na lista. Por exemplo, [abc] encontra "a", "b" ou "c". É possível
definir intervalos de caracteres: [a-z] encontra qualquer caractere de "a" a "z", e
[0123456789] é igual a [0-9]. O caractere "-" é tratado como literal se for o primeiro ou o
último da lista, ou se vier depois de contra-barra: [abc-], [-abc] ou [a\-bc].

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 233


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Metacaractere Descrição

[^ ] O acento circunflexo faz com que uma lista invertida de caracteres. Encontra uma
ocorrência de qualquer caractere não contido na lista. Por exemplo, [^abc] encontra
qualquer caractere que não seja "a", "b" ou "c". [^a-z] casa qualquer caractere que não
seja minúsculo.

^ Encontra o começo da cadeia de caracteres. Numa situação de múltiplas linhas, encontra o


começo das linhas. Logo percebe-se que as âncoras não encontram pedaços do texto, elas
servem apenas como uma referência de início de linha.

$ Encontra o fim da cadeia de caracteres ou a posição logo antes da quebra de linha do fim


da cadeia. Numa situação de múltiplas linhas, encontra o fim das linhas.

BRE \( \) Grupo de captura. Marca uma subexpressão. A cadeia de caracteres que encontra com o
ERE ( ) conteúdo dentro dos parênteses pode ser chamada posteriormente.

\n Associado com o item anterior. Encontra a n-ésima subexpressão marcada, em que n é um


dígito de 1 a 9. Essa construção é teoricamente irregular e não foi adotada pela sintaxe
POSIX ERE. Algumas ferramentas permitem referenciar mais de nove grupos de captura.

* Encontra o elemento precedente zero ou mais vezes. Por exemplo, ab*c encontra "ac",
"abc", "abbbc", etc.. [xyz]* encontra "", "x", "y", "z", "zx", "zyx", "xyzzy", e assim por
diante. \(ab\)* encontra "", "ab", "abab", "ababab", e assim por diante.

BRE \{m,n\} Encontra o elemento precedente pelo menos m vezes e não mais que n vezes. Por
ERE {m,n} exemplo, a\{3,5\} encontra somente "aaa", "aaaa", e "aaaaa". Esta funcionalidade não é
encontrada em algumas implementações muito antigas. Outras opções incluem omitir um
dos campos. Por exemplo, a\{3,\} encontra pelo menos três "a"s. Já \{3\} encontra
somente três "a"s. b{0,} é análogo a b*, b{0,1} é análogo a b? (ver o quantificador ?) e
b{1,} é idêntico a b+ (ver o quantificador +).

Uma característica da BRE é que os metacaracteres geralmente exigem barras invertidas


para serem tratados como tal.

Por exemplo, em BRE, a{1,2} é composto somente por literais, e encontrará somente
"a{1,2}". Para encontrar entre uma a duas ocorrências de "a", deve-se usar a expressão
regular a\{1,2\}. A motivação desse sistema é a compatibilidade com sistemas antigos, já
que na época da padronização já havia código Unix legado que usava chaves como literais.

ERE: expressões regulares estendidas

POSIX ERE (Extended Regular Expression, do inglês, expressões regulares estendidas).

Neste padrão a barra invertida "\" faz justamente o contrário do padrão BRE. A presença da
contra-barra significa que o caractere posterior deve ser interpretado como literal. Isso
significa que não são usadas barras invertidas para identificar metacaracteres. Pelo
contrário, elas servem justamente para transformar metacaracteres em literais. Retomando o
exemplo da seção anterior, em ERE, a{1,2} encontra uma a duas ocorrências de "a",
enquanto a\{1,2\} encontra o literal "a{1,2}".

Classes de caracteres
Já que diversos grupos de caracteres dependem de uma configuração de localização
específica, variando de acordo com a configuração de língua do sistema, o POSIX define
algumas classes (ou categorias) de caracteres para fornecer um método padrão de acesso a
234 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

alguns grupos específicos de caracteres bastante utilizados, como mostrado a seguir:

Classe Descrição

[:alnum:] Caracteres alfanuméricos, o que no caso de ASCII corresponde a [A-Za-z0-9].

[:alpha:] Caracteres alfabéticos, o que no caso de ASCII corresponde a [A-Za-z].

[:blank:] Espaço e tabulação, o que no caso de ASCII corresponde a [ \t].

[:cntrl:] Caracteres de controle, o que no caso de ASCII corresponde a [\x00-\x1F\x7F].

[:digit:] Dígitos, o que no caso de ASCII corresponde a [0-9]. O Perl oferece o atalho \d.

[:graph:] Caracteres visíveis, o que no caso de ASCII corresponde a [\x21-\x7E].

[:lower:] Caracteres em caixa baixa, o que no caso de ASCII corresponde a [a-z].

[:print:] Caracteres visíveis e espaços, o que no caso de ASCII corresponde a [\x20-\x7E].

[:punct:] Caracteres de pontuação, o que no caso de ASCII corresponde a [-


!"#$%&'()*+,./:;<=>?@[\\\]_`{|}~].

[:space:] Caracteres de espaços em branco, o que no caso de ASCII corresponde a [ \t\r\n\v\f]. O Perl
oferece o atalho \s, que, entretanto, não é exatamente equivalente; diferente do \s, a classe
ainda inclui um tabulador vertical, \x11 do ASCII.[5]

[:upper:] Caracteres em caixa alta, o que no caso de ASCII corresponde a [A-Z].

[:xdigit:] Dígitos hexadecimais, o que no caso de ASCII corresponde a [A-Fa-f0-9].

Vejamos os comandos que podem ser usados no shell para fazer buscas de textos usando
expressões regulares.

grep
$ grep [opções] expressão-regular arquivos

O comando grep é largamente usado no dia a dia das tarefas administrativas em Linux. Ele
filtra as linhas de um determinado arquivo procurando por uma expressão regular como
padrão. O grep pode ler um ou mais arquivos que são passados como argumento ou pode
receber na entrada padrão o redirecionamento da saída de outro processo. Se o grep receber
mais de um arquivo ou um wildcard como argumento para efetuar a sua busca, ele vai
indicar o nome do arquivo seguido de dois pontos e a linha encontrada.

O grep utiliza o padrão de Expressões Regulares POSIX BRE.

Assim, os meta-characters ? + { } | ( ) não tem significado especial. No padrão BRE esses


caracteres somente são interpretados com significado especial se precedidos com a contra-
barra \? \+ \{ \} \| \( \).

Suas opções mais frequentes são:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 235


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

-c: Mostra somente a contagem das ocorrências nos arquivos e não as linhas onde as
ocorrências foram encontradas;
-h: Mostra somente as linhas encontradas, sem a indicação do nome dos arquivos;
-i: Procura as ocorrências ignorando se as letras estão em maiúsculas ou minúsculas;
-v: Mostra todas as linhas do arquivo procurado menos as ocorrências encontradas.
Tem o efeito inverso;
-n: Mostra, além do texto das linhas encontradas, o número das linhas dentro dos
arquivos;
-B n: Mostra n linhas antes da linha encontrada;
-A n: Mostra n linhas depois da linha encontrada.
-E Muda o padrão POSIX BRE para POSIX ERE.
-F Não interpreta nenhum meta-caractere

Exemplos:

Procura a palavra uira no arquivo /etc/passwd:

$ grep uira /etc/passwd


uira:x:500:100:uira:/home/uira:/bin/bash

Procura todas as linhas começadas com a letra u no arquivo /etc/passwd. O acento


circunflexo simboliza o início de uma linha:

$ grep "^u" /etc/passwd


uucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bash
uira:x:500:100:uira:/home/uira:/bin/bash

Procura todas as linhas terminadas com a palavra false. O símbolo $ representa o fim de uma
linha:

$ grep "false$" /etc/passwd


mail:x:8:12:Mailer daemon:/var/spool/clientmqueue:/bin/false
wwwrun:x:30:8:WWW daemon apache:/var/lib/wwwrun:/bin/false

Procura todas as linhas que iniciam com as vogais no /etc/passwd. A expressão regular
chamada lista procura qualquer um dos caracteres dentro do colchete:

$ grep "^[aeiou]" /etc/passwd


uucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bash
at:x:25:25:Batch jobs daemon:/var/spool/atjobs:/bin/bash
uira:x:500:100:uira:/home/uira:/bin/bash

236 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

alias:x:501:1000::/var/qmail:/bin/false

Procura por todas as linhas em que o primeiro caracter seja qualquer um e o segundo
caracter seja uma vogal. O ponto final na expressão regular simboliza “um caractere
qualquer”:

$ grep "^.[aeiou]" /etc/passwd


root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/bash
news:x:9:13:News system:/etc/news:/bin/bash
uira:x:500:100:uira:/home/uira:/bin/bash

Procura por linhas que contenham uma sequência de pelo menos quatro números
consecutivos:

$ grep "[0-9][0-9][0-9][0-9]" /etc/passwd


squid:x:31:65534:WWW-proxy squid:/var/cache/squid:/bin/false
nobody:x:65534:65533:nobody:/var/lib/nobody:/bin/bash
alias:x:501:1000::/var/qmail:/bin/false
qmaild:x:502:1000::/var/qmail:/bin/false

Procura em todos os arquivos num diretório a ocorrência da palavra security.

$ grep security *

Veja o arquivo datas:

$ cat datas
1978-05-11 João
1976-02-23 Maria
2001-07-11 Pedro
1980-05-14 Carla

Para procurar as pessoas nascidas no dia 11 usando o grep, deve-se indicar que os
caracteres { } são metacaracteres usando a contra-barra:

$ grep "^[0-9]\{4\}-[0-9]\{2\}-11" datas


1978-05-11 João
2001-07-11 Pedro

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 237


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

egrep
$ egrep [opções] expressão-regular arquivos

O comando egrep funciona como a opção -E do grep.

Ele na verdade utiliza o padrão POSIX de Expressões Regulares ERE na busca. Isto significa
que a contra-barra deve ser usada para definir que o próximo caractere é um caractere literal
e não um metacaractere como no padrão POSIX BRE.

Isto significa que os caractes ? + { } | ( ) não precisam da contra-barra para funcionar


como meta-caracteres.

Tome como exemplo a lista de aniversários. Com o comando grep e sem as contra-barras, o
grep não e capaz de encontrar os aniversariantes de Maio:

$ grep "^[0-9]{4}-05-[0-9]{2}" datas

Já o egrep é capaz de interpretar as { } como meta-caracteres sem a contra-barra. É


importante que você guarde a diferença do uso das contra-barras entre o grep (que
necessita delas para indicar metacaracteres) e o egrep (cujo efeito das contra-barras é
inverso, indicando um caractere comum):

$ egrep "^[0-9]{4}-05-[0-9]{2}" datas


1978-05-11 João
1980-05-14 Carla

Somente com a opção -E o grep é capaz de achar as ocorrências:

$ grep -E "^[0-9]{4}-05-[0-9]{2}" datas


1978-05-11 João
1980-05-14 Carla

É muito importante você saber o que faz a contra-barra no padrão POSIX BRE x POSIX ERE.

fgrep
$ fgrep [opções] chave-procura arquivos

O comando fgrep também é parecido com o grep, mas ele não suporta expressões regulares,
procurando somente uma chave de busca ou um texto comum nos arquivos.

238 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Por este motivo, é mais rápido que o grep, mas menos versátil.

Ele é o mesmo que a opção -F do grep.

Exemplo:

$ fgrep batata *
listaab:batata
supermercado:batata

cat
$ cat [opções] arquivo

O comando cat concatena arquivos, imprime seu conteúdo de tela e ainda pode receber
texto digitado pelo teclado para um arquivo.

As opções mais comuns do cat são:

-b Numera as linhas que não estão em branco


-E Mostra $ no final de cada linha
-n Numera todas as linhas, inclusive em branco
-s Elimina as linhas repetidas em branco
-T Troca o código da tecla TAB por ^I

Vejamos como criar um arquivo com apenas algumas linhas de texto:

$ cat > teste.txt

Agora você pode digitar qualquer texto. Quando terminar, pressione Ctrl d em uma linha
vazia para finalizar a entrada de dados e salvar o arquivo teste.txt.

Para ver o conteúdo do arquivo recém-criado:

$ cat teste.txt

O cat também pode servir para concatenar arquivos.

$ cat texto1.txt > texto.txt

Observe que neste exemplo o conteúdo do arquivo texto.txt é substituído pelo texto1.txt.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 239


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Para adicionar o conteúdo do texto1.txt no final arquivo texto.txt o correto seria:

$ cat texto1.txt >> texto.txt

Mostra o conteúdo de um arquivo de código fonte com as linhas numeradas:

$ cat -n teste.c
1 #include <stdio.h>
2 int main()
3 {
4 printf("Certificação Linux!\n");
5 };

tail
$ tail [opções] arquivo

O inverso do head também é possível. O comando tail (do inglês cauda) visualiza as últimas
10 linhas de um arquivo.

As opções mais frequentes são:

-n número: Especifica o número de linhas finais que o tail irá mostrar de um arquivo;
-f: Mostra as últimas linhas finais de um arquivo continuamente enquanto outro
processo grava mais linhas. Muito útil para visualizarmos arquivos de LOG.

Exemplos:

$ tail –n 50 /var/log/messages
$ tail –f /var/log/messagens

head
$ head [opções] arquivo

Suponha que você quer ler somente as primeiras linhas de um arquivo.

O comando head (Do inglês cabeçalho) mostra as primeiras 10 linhas do início de um


arquivo.

240 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

A opção frequentemente utilizada é:

-n número: Configura o número de linhas que o head irá mostrar.

Exemplo:

$ head –n 50 LEIAME.TXT

less
$ less [opções] arquivo

Imagine agora que você quer ver o conteúdo de um arquivo grande. O comando less serve
para paginar o conteúdo de um arquivo, e permite que você navegue para frente e para
trás.

Além disso, o comando less carrega o arquivo de forma paginada, desta forma ele inicia mais
rapidamente que os editores de texto como o vi.

O comando less permite que você pressione Seta para Cima e Seta para Baixo ou
PgUP/PgDown para fazer o rolamento da página. Para sair do less pressione q.

Exemplos:

$ less /var/log/messages

$ cat /var/log/messages | less

Nem sempre o comando less está instalado como padrão nas distribuições. Você pode
instalar o pacote usando o gerenciador de pacotes da sua distribuição.

more
$ more arquivo

O comando more serve para fazer a paginação de um arquivo ou paginar a saída padrão de
um programa. O more é bem primitivo, e permite a paginação somente do início do fluxo de
texto para o final utilizando o "espaço" para passar as páginas ou "enter" para descer linha a
linha.

Para ler um arquivo de forma paginada:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 241


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

$ more README

Para paginar a saída padrão de um outro programa:

$ cat REAME | more

Fluxos de Dados, Condutores e


Redirecionamentos

Outro conceito importante é o redirecionamento. Como o Linux foi criado por programadores
para programadores, fez-se necessário que os comandos e processos tivessem a habilidade
de tratar as entradas e saídas de dados com grande facilidade.

Antes de detalharmos a habilidade de redirecionamento do Linux precisamos definir o que


são entradas padrão, saída padrão e saída de erro:

A Entrada Padrão (stdin) é a entrada de um fluxo de texto. Como exemplos temos


o teclado, o mouse, um disquete, etc. Todos eles alimentam o computador com
informações. Pode ser representado pelo número 0.
A Saída Padrão (stdout) é a saída de um fluxo de texto em condições normais.
Como exemplos temos o monitor, a impressora, o disquete, um arquivo, etc. Todos
eles recebem informações do computador. Pode ser representado pelo número 1.
A Saída de Erro (stderr) é a saída de um fluxo de texto em condições de erro ou
insucesso em um determinado processamento. A saída de erro poderá ser
direcionada para o monitor ou para um arquivo de LOG. Pode ser representado pelo
número 2.

Você pode ver esses fluxos de dados no diretório /dev com o comando:

$ ls -l /dev/std*
lrwxrwxrwx 1 root root 15 ago 15 10:53 /dev/stderr ->
/proc/self/fd/2
lrwxrwxrwx 1 root root 15 ago 15 10:53 /dev/stdin ->
/proc/self/fd/0
lrwxrwxrwx 1 root root 15 ago 15 10:53 /dev/stdout ->
/proc/self/fd/1

Como você pode perceber, o arquivo /dev/stderr é um link simbólico para um arquivo no
/proc/self/fd/2. O arquivo /dev/stdin aponta para o /proc/self/fd/0 e /dev/stdout para
/proc/self/fd/1.

242 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

O diretório /proc/self é uma representação do Kernel para dar informações sobre o processo
em execução. Neste pseudo-diretório especial é possível acessar várias informações sobre o
processo que está sendo executado no momento. O diretório /proc/self/fd é também uma
abstração que contém os descritores de arquivos (file descriptors), que é outra abstração que
o Linux e o Unix fazem para representar através de um arquivo um recurso de entrada ou
saída de dados. É a forma que os programadores encontraram de dar acesso fácil para
entrada e saída de dados.

É por isso que o stderr é representado pelo número 2, o stdin pelo número 0 e o stdout pelo
1.

É por causa dos descritores de arquivos que podemos redirecionar a entrada padrão ou a
saída padrão do fluxo de dados de um determinado processo para outro processo ou um
arquivo com muita facilidade.

Para redirecionar um resultado de uma saída para uma entrada de dados ou arquivo
utilizamos o sinal de maior ">".

E para direcionarmos algum arquivo como uma entrada de dados usamos o sinal de menor
"<".

O sinal duplo ">>" significa adicionar algo, geralmente ao final de um arquivo, sem
sobrescrever o seu conteúdo.

E o sinal duplo <<palavra geralmente serve para permitir que o usuário entre com dados
digitando no terminal, até que a palavra indicada seja digitada, uma vez que a palavra
funciona como um delimitador.

O sinal "&" pode ser usado para juntar as saídas como em 2>&1.

Ainda podemos redirecionar uma saída para uma entrada usando uma barra vertical
especial, o sinal em inglês chamado “pipe” "|" ou duto.

E os processos podem estar ligados aos terminais, conhecidos como tty. O termo tty deriva
da palavra Teletype.

Nos primórdios do Linux, o administrador utilizava o terminal principal do computador, que


era representado pelo arquivo /dev/console e os usuários eram ligados aos terminais
"burros" através de placas e conexões seriais, representados pelos arquivos /dev/ttySN,
onde N era o número do terminal ao qual o usuário estaria ligado.

Assim, terminais no Linux são representados pelos descritores de arquivos no diretório /dev/
com prefixo tty:

$ ls -1 /dev/tty*
/dev/tty
/dev/tty0
/dev/tty1
( ... )

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 243


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

O Linux mantém os terminais, mas de forma virtual, que podem ser acessados com a
combinação de teclas Ctrl-Alt-F1, Ctrl-Alt-F2 até Ctrl-Alt-F6, tanto em ambiente gráfico como
em ambiente texto.

O comando "ps -a" pode mostrar quais processos estão conectados a quais terminais:

$ ps -a
PID TTY TIME CMD
2738 tty2 00:12:41 Xorg
2751 tty2 00:00:00 gnome-session-b
9274 pts/0 00:00:00 ps

Observe que o ambiente gráfico está atrelado ao terminal tty2.

No exemplo o comando "ps" não está atrelado a um tty, mas ao pts.

O termo pts vem de Pseudo-Terminal, que nada mais é do que um terminal tty emulado
por um programa, como, por exemplo, o ssh. Então os programas em execução através de
uma conexão remota, estarão atrelados a um terminal falso denominado pts.

Existe também o comando tty, devolve qual é o terminal que o processo do shell está
atrelado, seja ele um terminal real (tty) ou emulado (pts):

$ tty
/dev/pts/0

Usando essa premissa, é simples manipular dispositivos no Linux através dos descritores de
arquivos no diretório /dev/.

Por exemplo, é possível mandar uma mensagem para um usuário remoto conectado via ssh
num terminal. Para isto, basta saber qual é o terminal que ele está conectado com o
comando w:

$ w
23:40:41 up 1 day, 17:57, 2 users, load average: 0.00, 0.02,
0.02
USER TTY FROM LOGIN@ IDLE JCPU PCPU
WHAT
arthur pts/0 10.211.55.2 10:31 1:52 0.28s 0.28s -
bash
uiraribe pts/1 10.211.55.2 23:36 1.00s 0.03s 0.00s w

244 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Desta forma, pode-se mandar uma mensagem para o Arthur no pts/0, utilizando o comando
echo seguido do redirecionador ">" e o descritor de arquivos que representa o pseudo-
terminal pts/0:

$ echo "Hello" > /dev/pts/0

Qualquer comando pode ter a sua saída redirecionada para um arquivo, ou para um
dispositivo utilizando um descritor de arquivos que o representa.

No exemplo seguinte listamos os arquivos num diretório gravando o resultado no arquivo


saída.txt :

$ ls > saida.txt

O redirecionamento é utilizando principalmente por programas ou quando o resultado de um


processamento não será observado diretamente pelo usuário no terminal, mas enviado para
outro programa, para um arquivo ou para um dispositivo.

Aqui o programa mail recebe como argumento o endereço de e-mail e ao invés de


utilizarmos o teclado como entrada padrão, redireciona-se o arquivo texto e-mail.txt para o
programa mail na entrada padrão dele com o sinal "<":

$ mail uribeiro@gmail.com < e-mail.txt

Para enviar toda a saída do programa folha_pagamento para o arquivo1, inclusive com os
erros:

$ ./folha_pagamento > arquivo1

É possível filtrar somente a saída padrão do programa folha_pagamento para arquivo1, SEM
os erros, usando somente o descritor "1":

$ ./folha_pagamento 1 > arquivo1

Se quisermos enviar toda a saída de erros para o arquivo arquivo_ erro.log, podemos usar o
descritor "2":

./folha_pagamento 2 > arquivo_erro.log

Tanto a saída padrão e os erros podem ser enviados de forma combinada para o arquivo
arquivo1, usando "2>&1" ou "1>&2" (não faz diferença a ordem) :

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 245


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

$ ./folha_pagamento > arquivo1 2>&1

É possível também separar as saídas em arquivos diferentes, enviando o resultado com a


saída normal para o arquivo_sucesso.log e a saída de erro para o arquivo_erro.log.

$ ./folha_pagamento 1 > arquivo_sucesso.log 2> arquivo_erro.log

Outra possibilidade é enviar somente a saída de erros para o limbo usando a abstração de
/dev/null:

$ ./folha_pagamento 2 > /dev/null

O mesmo pode ser feito para enviar os erros para a impressora, usando a abstração que
representa impressoras no /dev/lp0:

$ ./folha_pagamento 2 > /dev/lp0

Toda vez que você quer enviar a saída padrão de um programa para a entrada padrão de
outro programa, você precisa usar um condutor, com o sinal "|" do teclado.

Neste exemplo, o resultado do programa folha_pagamento é enviado como entrada para o


programa imprime_boletos e a saída de erro do imprime_boletos para o arquivo erro.log:

$ ./folha_pagamento | imprime_boletos 2> erros.log

Para mandar um email do terminal com o conteúdo de um arquivo, pode-se usar o


redirecionador "<":

$ mail uribeiro@gmail.com -s urgent < mail.txt

Para receber dados do terminal e enviá-los para a entrada padrão de um comando, pode-se
usar o "<<palavra". Desta forma o terminal irá receber um texto do teclado, até que a
palavra "fim" for digitada em uma linha:

$ mail uribeiro@gmail.com -s urgent <<fim


> Olá,
> Este é um email de teste
> fim

É comum o Linux redirecionar a saída de erros para o descritor de arquivos especial /dev/null.
Este arquivo especial é o limbo do Linux, onde tudo que vai para lá some:

246 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

$ find / -name arquivo 2>/dev/null

Desta forma, os erros que o find encontrar não serão mostrados no terminal, somente a saída
padrão.

xargs
$ xargs comando [opções] argumento

O xargs executa o comando ou programa e passa como argumento para esse comando o que
foi recebido como entrada padrão.

Ele resolve o problema de pegar a saída padrão de um programa e usa-la como argumentos
ou parâmetros para um comando ou programa.

As opções mais frequentes são:

-p: Pergunte ao usuário se o comando deve ser executado antes de fazê-lo


-r: Não execute o comando quando receber linhas vazias
-t: Mostre o comando na tela antes de executá-lo

Veja a lista de supermercado:

$ cat supermercado
arroz
feijão
carne
batata
alface
tomate
arroz
carne

Agora vamos fazer o xargs receber como entrada padrão esta lista, e executar o comando
echo com os itens da lista como parâmetro:

$ cat supermercado | xargs echo

O que o xargs faz é como se escrevesse o seguinte comando:

$ echo arroz feijão carne batata alface tomate arroz carne

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 247


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Da mesma forma, pode-se criar diretórios com os nomes dos itens da lista. Neste exemplo o
comando xargs irá criar um diretório executando o mkdir com o nome de cada item contido
no arquivo supermercado:

$ cat supermercado | xargs mkdir

Como você pode ver, o xargs pode ser muito útil para automatizar várias tarefas.

Neste exemplo, lista-se todos os arquivos com extensão txt, e depois utiliza-se o xargs para
compactar cada um deles:

$ ls -1 *.txt | xargs gzip

A opção "-t" do xargs é interessante, pois ele escreve o comando que irá executar:

$ ls -1 *.txt | xargs -t gzip


gzip teste1.txt teste2.txt teste3.txt

tee
$ tee [opções] arquivos

O comando tee recebe dados de uma entrada padrão, grava o que recebeu em um arquivo e
ainda envia para sua saída padrão. É utilizado para gravar a saída padrão de um comando
em um arquivo e ainda enviar esta saída para outro comando.

Ele resolve o problema de enviar a saída de um programa para um arquivo e ao mesmo


tempo para um outro programa.

A opção é:

-a: Adiciona no final do arquivo o que foi recebido ao invés de gravar por cima.

Exemplo:

$ folha_pagamento | tee folha.txt | imprime_boleto | tee


boleto.txt | lpr 2> erros.log

O resultado do programa folha_pagamento é gravado pelo tee no arquivo folha.txt e enviado


para o programa imprime_boleto. Por sua vez o programa imprime_boleto redireciona sua
saída para o segundo tee que grava o resultado no arquivo boleto.txt que também é enviado
para o programa lpr que imprime os boletos. Se houver erro na impressão, este erro é

248 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

gravado no arquivo erros.log.

tr
$ tr [opções] variável_busca variável_troca

O comando tr faz a troca de uma variável por outra especificada. Este comando não trabalha
diretamente com arquivos, portanto deve ser utilizado com a saída padrão de outro
comando, com o condutor pipe.

O comando tr pode fazer a troca de caracteres da variável de busca pela variável de troca,
mas o número de caracteres precisa ser o mesmo em ambas.

As opções mais frequentes são:

-d: Apaga as ocorrências da variável de busca;


-s: Suprime as ocorrências repetidas da variável de busca;

Veja o exemplo com a lista de supermercado, onde o tr é usado para trocar todas as letras
minúsculas para maiúsculas:

$ cat supermercado | tr a-z A-Z


ARROZ
FEIJãO
CARNE
BATATA
ALFACE
TOMATE
ARROZ
CARNE

echo
$ echo parâmetro

O comando echo imprime algo na tela ou na saída padrão. Ele também pode ser usado para
imprimir os valores de variáveis.

Veja neste exemplo a diferença entre aspas simples e duplas:

$ echo "Bom dia"


Bom dia

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 249


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

$ NOME="Uirá"
$ echo "Bom dia $NOME"
Bom dia Uirá

$ echo 'Bom dia $NOME'


Bom dia $NOME

A saída do comando echo também pode ser redirecionada para um arquivo:

$ echo "Bom dia $NOME" > /tmp/arquivo


$ cat /tmp/arquivo
Bom dia Uirá

sort
$ sort [opções] arquivo

O comando sort ordena as linhas de um arquivo.

Suas opções são:

-b: Ignora espaços no início da linha;


-d: Coloca as linhas em ordem alfabética e ignora a pontuação;
-f: Ignora a diferença entre maiúsculas e minúsculas;
-I: Ignora caracteres de controle;
-h: ordenar em formato humano
-m: Mescla dois ou mais arquivos em um arquivo ordenado de saída;
-M: Trata as três primeiras letras das linhas como mês (ex: JAN);
-n: Ordena pelos números no início das linhas;
-r: Ordena em ordem inversa;
-u: Se a linha for duplicada, mostra somente a primeira;
-o: Envia a saída do comando para o arquivo.

Como exemplo, vamos ordenar um arquivo de emails:

$ sort emails
alessandra@empresa.com
arthur@empresa.com
carla@empresa.com
demetrios@empresa.com
250 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

flavia@empresa.com
paulo@empresa.com
root@empresa.com
uira@empresa.com

Um cuidado deve ser tomado ao ordenar números. Veja o exemplo do arquivo desordenado
abaixo:

$ cat numeros
330
40
4
3
31
19
1

Ao usar o sort sem nenhum parâmetro, ele ordena primeiro usando o primeiro byte, depois o
segundo:

$ sort numeros
1
19
3
31
330
4
40

Para ordenar usando os números como caracter, você pode usar a opção -n, ou a opção -h
para ordenar em formato humano:

$ sort -n numeros
1
3
4
19
31
40
330

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 251


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

awk
$ awk [ opções ] -f programa [ -- ] arquivo

O awk é uma poderosa ferramenta, que permite processar textos e fazer alterações em
arquivos. Ele pode interpretar pequenos scripts para processar algum arquivo ou texto.

Existem outras variantes do AWK, tais como: BWK, GAWK e MAWK, que são implementações
de diferentes desenvolvedores com algumas melhorias.

O awk pode receber comandos diretamente como parâmetros, ou através de um arquivo,


utilizando-se a opção "-f' seguido do nome do arquivo que contém os comandos.

Exemplo:

Dado um arquivo com um texto separado por espaços, o comando "print" servirá para exibir
algo na tela. As variáveis $0, $1, $2, $3 e $4 pode imprimir todo o conteúdo ($0), ou cada
coluna do texto:

Para imprimir todo o conteúdo do arquivo:

$ awk '{print $0}' arquivo


Leia Organa General Resistência
Luke Skywalker Jedi Resistência
Darth Vader Sith Império
Obi-Wan Kenobi Jedi Resistência

Para imprimir somente a primeira coluna:

$ awk '{print $1}' arquivo


Leia
Luke
Darth
Obi-Wan

Para imprimir a segunda coluna:

$ awk '{print $2}' arquivo


Organa
Skywalker
Vader
Kenobi

252 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

É possível também brincar com o texto:

$ awk '{print $1 " " $2 " é um " $3 " da "$4}' arquivo


Leia Organa é um General da Resistência
Luke Skywalker é um Jedi da Resistência
Darth Vader é um Sith da Império
Obi-Wan Kenobi é um Jedi da Resistência

Para listar somente os logins dos usuários no arquivo /etc/passwd, pode-se usar a opção "-F",
indicando o delimitador:

$ awk -F':' '{ print $1 }' /etc/passwd


root
bin
daemon
adm

O awk aceita as diretivas if, for e while como na linguagem C, e também operadores
matemáticos e muitas outras coisas.

sed
$ sed [opções] {script} [arquivos]

O comando sed é um editor de textos simples utilizado para fazer pequenas transformações
no conteúdo dos arquivos. Ele utiliza o padrão POSIX ERE para expressões regulares.

O sed recebe um texto de um ou mais arquivos passados como argumento na linha de


comando e o transforma enviando a modificação para a saída padrão STDOUT (monitor de
vídeo).

Se quisermos que o sed realmente altere o conteúdo do arquivo é necessário utilizarmos o


redirecionador maior-que “>” para um outro arquivo qualquer.

Outra possibilidade é usar a opção “-iSUFIXO” que possibilita editar diretamente o arquivo
original e salvando uma cópia de segurança com o nome do arquivo seguido do SUFIXO
indicado.

As opções do sed são:

-iSUXIFO altera o arquivo


-e imprime na tela sem alterar o arquivo

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 253


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

-n faz a supressão, mostra só o resultado do comando


-f arquivo Lê um script com expressões do sed

Os comandos que o sed aceita são:

s substitui um trecho de texto por outro


! inverte a lógica do comando
; separador de comandos
| separador de strings
d no final deleta
p no final imprime
g no final (como se usa o d e p) altera todas as ocorrências

Para trocar ocorrências por outro texto, a opção "s" do sed pode ser utilizada. As barras
normais "/" são usadas para separar o texto a ser buscado e o texto novo. Neste caso, a troca
é enviada para a saída padrão STDOUT e o arquivo permanece intacto:

$ sed "s/velho/novo/" arquivo

Para troca o nome uira pelo nome carla no arquivo /etc/passwd e imprimir na saída padrão:

$ sed ‘s/uira/carla/’ /etc/passwd

Neste exemplo abaixo a ocorrência /usr/local/bin é alterada para /usr/bin e gravada em


textonovo.txt sem alterar o arquivo original. O uso da conta-barra foi necessário para indicar
que o caracter "'/" do caminho não é o separador de substituição do sed:

$ sed ‘s/\/usr\/local\/bin/\/usr\/bin/’ texto.txt >


textonovo.txt

Você pode optar por utilizar a opção –i, de forma que o sed irá alterar o arquivo e manter um
backup do arquivo original em arquivo.bkp

$ sed –i.bkp ‘s/\/usr\/local\/bin/\/usr\/bin/’ arquivo

Coloca a palavra "comprar" no início de cada linha:

$ sed 's/^/comprar /' supermercado


comprar arroz
comprar feijão
comprar carne

254 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

comprar batata
comprar alface
comprar tomate
comprar arroz

Imprime somente a terceira linha do arquivo supermercado:

$ sed -n '3p' supermercado


carne

Imprime da terceira até a quinta linha do arquivo supermercado:

$ sed -n '3,5p' supermercado


carne
batata
alface

O comando "d" pode ser usado para apagar todas as linhas que contém a palavra carne e
cria uma cópia:

$ sed -i.bkp '/carne/d' supermercado


$ cat supermercado
arroz
feijão
batata
alface
tomate
arroz

Troca todas as ocorrências de arroz e batata por couve-flor:

$ sed 's/arroz\|batata/couve-flor/' supermercado


couve-flor
feijão
couve-flor
alface
tomate
couve-flor

Apaga todas as linhas em branco, alterando o arquivo:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 255


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

$ sed -i '/^$/d' arquivo.txt

Retira todas as TAGs HTML do arquivo:

$ sed 's/<[^>]*>//g' arquivo.txt

Um conjunto de expressões do sed pode ser gravado em arquivo texto para ser lido por ele
como um interpretador com a opção -f. Neste caso, varios comandos do sed foram gravados
em um arquivo chamada expressoes:

$ cat expressoes
s/carla/uira/
s/<p>/<p align=center>/

$ sed -f expressoes arquivo.txt

cut
$ cut [opções] arquivo

O comando cut traduzido ao pé da letra significa cortar. Ele lê o conteúdo de um ou mais


arquivos e tem como saída uma coluna vertical.

Suas opções mais frequentes são:

-b número: Imprime uma lista vertical com o byte número (da esquerda para
direita);
-c número: Imprime uma lista vertical com o caractere número (da esquerda para
direita);
-d delimitador: Configura o delimitador que separa uma coluna da outra. O padrão é
o Tab;
-f número: Imprime a coluna número.

Exemplos:

Para pegar só os logins das contas de usuários no arquivo /etc/passwd, usando o cut. Neste
caso o delimitador será o ":" e a primeira coluna.

$ cut –d":" -f 1 /etc/passwd

Para pegar só o primeiro byte do arquivo /etc/passwd:


256 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

$ cut –b 1 /etc/passwd

Para pegar os nomes de grupos:

$ cat /etc/group | cut -f1 -d':'

O comando cut funciona exatamente como o comando awk. O exemplo a seguir produz o
mesmo resultado do comando anterior:

$ awk -F':' '{ print $1 }' /etc/group

printf
$ printf FORMATO ARGUMENTO

O comando printf formata e imprime dados.

Ele geralmente é usado em pequenos scripts e segue o padrão FORMATO seguido de


ARGUMENTOS.

Os ARGUMENTOS são inseridos no texto no FORMATO indicado.

Exemplo:

$ printf "Meu nome é %s.\nPrazer em conhece-lo.\n" "Uirá"


Meu nome é Uirá.
Prazer em conhece-lo.

O printf permite substituições no texto, com argumento informado. No caso, a variável %s é


trocada pelo argumento "Uirá".

wc
$ wc [opções] [arquivo]

Suponha que você quer contar o número de linhas, palavras ou caracteres de um arquivo. O
comando wc pode ser usado para contar as linhas, palavras e caracteres de um ou mais
arquivos. Se mais de um arquivo for passado como argumento, ele irá apresentar as
estatísticas de cada arquivo e também o total.

As opções mais frequentes são:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 257


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

-c: Conta o número de caracteres de um ou mais arquivos;


-l: Conta o número de linhas de um ou mais arquivos;
-L: Conta o número de caracteres da maior linha do arquivo;
-w: Conta as palavras de um ou mais arquivos.

Neste exemplo, vamos usar o wc para contar os itens únicos da lista de supermercado:

$ sort supermercado | uniq | wc


6 6 41

Nossa lista tem 6 itens (um por linha), seis palavras e 41 caracteres.

paste
$ paste [opções] arquivo1 arquivo2

O comando paste (colar) é utilizado para concatenar as linhas de diversos arquivos em


colunas verticais.

As opções frequentemente utilizadas são:

-d’s’ Separa as colunas com o símbolo s dentro das aspas simples;


-s Concatena todo o conteúdo de um arquivo com uma linha para cada arquivo.

No exemplo abaixo suponha que você quer pegar todos os logins dos usuários do Linux no
arquivo /etc/passwd e juntar com o sufixo "@empresa.com" para formar uma lista de emails:

$ cut -d":" -f1 /etc/passwd > usuarios


$ cat usuarios
root
uira
carla
arthur
alessandra
flavia
demetrios
paulo

Neste caso, como você tem um arquivo com 8 nomes, você precisa criar um arquivo com 8
linhas com "empresa.com":

258 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

$ cat empresa
empresa.com
empresa.com
empresa.com
empresa.com
empresa.com
empresa.com
empresa.com
empresa.com

Agora podemos usar o comando paste com a opção -d para informar o delimitador:

$ paste -d"@" usuarios empresa


root@empresa.com
uira@empresa.com
carla@empresa.com
arthur@empresa.com
alessandra@empresa.com
flavia@empresa.com
demetrios@empresa.com
paulo@empresa.com

Operações com Arquivos e Diretórios

Os comandos a seguir manipulam arquivos e diretórios no Linux.

touch
$ touch [opções] arquivo

Todo arquivo contém informações de metadados, como o seu nome, data de criação, data de
modificação e data de último acesso, dentre outras informações. O comando touch serve
para alterar os metadados de tempo dos arquivos, modificando a data de último acesso ou
de modificação dos arquivos.

Isto pode ser útil para marcar um arquivo sofrer backup incremental ou diferencial a partir de
uma determinada data, ou ser sincronizado num repositório, sem a necessidade de alterar o
conteúdo do arquivo, bastando alterar a sua data de modificação.

O comando touch também é útil para criar um arquivo vazio, se o arquivo informado não

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 259


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

existir.

As opções mais comuns são:

-a Muda a informação de último acesso do arquivo


-c Não cria o arquivo se ele não existir
-d data Permite que uma data no formato texto seja informada ao invés da data e
hora corrente
-m Muda a hora de modificação do arquivo
-t stamp Usa o formato [[CC]YY]MMDDhhmm[.ss] ao invés da data e hora corrente
--time=PALAVRA Muda a informação de tempo informada, que pode ser atime
(acesso) ou modificação (mtime)

A opção -d=data é texto de data legível por humanos, na sua maioria livre, como "Dom, 29
de fevereiro de 2004 16:21:42 -0800 "ou" 2004-02-29 16:21:42 "ou até "próxima quinta-
feira". Uma sequência de datas pode conter itens indicando data do calendário, hora do dia,
fuso horário, dia da semana, hora relativa, data relativa e números.

No exemplo abaixo o touch é usado para criar um arquivo fazio chamado config.txt:

$ touch config.txt
$ ls -l
-rw-rw-r-- 1 ec2-user ec2-user 0 set 13 22:29 config.txt

Uma lista também pode ser usada para criar vários arquivos:

$ touch teste{1..3}.txt
$ ls -l
-rw-rw-r-- 1 ec2-user ec2-user 226 set 12 16:14 teste1.c
-rw-rw-r-- 1 ec2-user ec2-user 0 set 13 22:31 teste1.txt
-rw-rw-r-- 1 ec2-user ec2-user 0 set 13 22:31 teste2.txt
-rw-rw-r-- 1 ec2-user ec2-user 0 set 13 22:31 teste3.txt

O touch pode ser usado para alterar a data de modificação de um arquivo, como por exemplo
teste1.c que foi alterando em 12/set:

$ touch -d "09/12" teste1.c


$ ls -l
-rw-rw-r-- 1 ec2-user ec2-user 226 set 12 22:35 teste1.c
-rw-rw-r-- 1 ec2-user ec2-user 0 set 13 22:31 teste1.txt
-rw-rw-r-- 1 ec2-user ec2-user 0 set 13 22:31 teste2.txt
-rw-rw-r-- 1 ec2-user ec2-user 0 set 13 22:31 teste3.txt

260 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Você também pode especificar uma data e hora específica ao invés da data e hora correntes.
Neste exemplo: 11/05/1978 às 18:40:30 :

$ touch -t 197805111840.30 teste1.c


$ ls -l
-rw-rw-r-- 1 ec2-user ec2-user 226 mai 11 1978 teste1.c

O formato da hora específica é definido pelo padrão CCYYMMDDhhmm.ss, em que:

CC – Os dois primeiros dígitos do ano.


YY – Os dois dígitos subsequentes do ano.
MM – O mês do ano [01-12].
DD – O dia do mês [01-31].
hh – A hora do dia [ 00-23].
mm – O minuto da hora [00-59].
ss – O segundo do minuto [00-59]

Você também pode especificar a data e a hora como um conjunto (string) usando a opção -d.
A linha de comando a seguir mostra um exemplo que define a data para 23 de fevereiro e a
hora é automaticamente definida para 00:00:

$ touch -d '23 Feb' teste1.c


$ ls -l teste*
-rw-rw-r-- 1 ec2-user ec2-user 226 fev 23 2019 teste1.c

ls
$ ls [opções] [arquivo]

O comando ls é sem dúvida um dos mais utilizados. Ele serve basicamente para listar
arquivos e conteúdo de diretórios.

Suas opções mais comuns são:

-a, --all Mostre todos os arquivos, inclusive os arquivos escondidos que


começam com "."
-A, --almost-all Mostra quase todos os arquivos, menos as entradas "." e ".."
-b, --escape Mostra os arquivos com escape, para caracteres não gráficos
-c Mostra e ordena pela adata de modificação dos arquivos
-C Mostra por colunas
-d Mostra somente os diretórios

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 261


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

-1 Mostra uma coluna somente com nomes dos arquivos


-h Mostra tamanho dos arquivos em formato humano
-l Mostra uma lista longa dos arquivos
-m Listas os arquivos separados por virgula
-S Ordena por tamanho
-R Lista os subdiretórios recursivamente
-x Lista em linhas ao invés de colunas
--color=auto Diferencia os tipos de arquivos por cor

Exemplos:

$ ls -m /boot/*138*
/boot/config-4.14.138-114.102.amzn2.x86_64,
/boot/initramfs-4.14.138-114.102.amzn2.x86_64.img,
/boot/symvers-4.14.138-114.102.amzn2.x86_64.gz,
/boot/System.map-4.14.138-114.102.amzn2.x86_64,
/boot/vmlinuz-4.14.138-114.102.amzn2.x86_64

$ ls -Sl ~/
-rw-rw-r-- 1 ec2-user ec2-user 221427 dez 7 2018 mysqltuner.pl
-rw-rw-r-- 1 ec2-user ec2-user 35487 mai 21 2017
vfsync-2017-05-21.tar.gz

• No Linux os arquivos que iniciam com "." não são mostrados sem a
opção -a do ls
• O arquivo "." é um apontador para o diretório corrente
• O arquivo ".." é um apontador para o diretório acima (ou anterior)
• Todos os diretórios possuem os arquivos "." e ".."

file
$ file [opções] arquivo

O comando file é utilizado para se determinar qual é o tipo de arquivo informado como
parâmetro.

Ao contrário do Windows, as extensões de arquivo nada significam no Linux. O comandos file


faz três tipos de checagem para determinar qual é o tipo do arquivo:

Teste de sistema de arquivos;

262 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Teste de Magic Number;


Teste de Linguagem

O primeiro teste de sistema de arquivos é feito para determinar se o arquivo é um arquivo


comum, um diretório, um link, um dispositivo, um socket de conexão, etc. No Linux
absolutamente tudo é um arquivo. O tipo de arquivo no sistema de arquivos determina se ele
é um arquivo comum ou outro tipo especial.

O segundo teste de Magix Number verifica os dois primeiros bytes do arquivo para
determinar o seu tipo. Existe uma convenção na computação que determina que os dois
primeiros bytes do arquivo devem conter um código que indica o seu tipo. Por exemplo, os
scripts começam com o código "#!", seguido do caminho completo do interpretador que irá
interpretar e executar o script.

O terceiro teste, uma vez que foi determinado que o arquivo é um programa, script ou código
fonte, indica qual é a linguagem do programa.

Exemplos:

$ file teste1.c
teste1.c: C source, UTF-8 Unicode text

$ file teste1
teste1: ELF 64-bit LSB executable, x86-64, version 1 (SYSV),
dynamically linked (uses shared libs), for GNU/Linux 2.6.32,
BuildID[sha1]=f63857e5ce1a259a5228b1ea15ced24867583793, not
stripped

$ file backup.sh
backup.sh: Bourne-Again shell script, ASCII text executable

$ file supermercado.xz
supermercado.xz: XZ compressed data

$ file MAPA_MENTAL_LPI.pdf
MAPA_MENTAL_LPI.pdf: PDF document, version 1.6

Uso de coringas

Quando estamos trabalhando com arquivos e diretórios no shell é muito comum precisarmos
trabalhar com diversos arquivos de uma vez. Para tornar este tipo de tarefa mais simples, o

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 263


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Linux oferece o recurso de coringa para os nomes dos arquivos e diretórios.

Assim como no baralho de cartas, os coringas são símbolos que podem significar muitas
coisas. No Linux possibilitam que você os utilize como parte do nome dos arquivos e
diretórios. Veja a tabela abaixo:

Símbolo Descrição

* Significa “vale qualquer coisa” e pode substituir um ou mais caracteres de um nome. Por
exemplo “Certifi*” pode significar “Certificado”, “Certificação” ou qualquer outra combinação
de nomes de arquivos que inicie com “Certifi”.

? Significa que pode substituir um caractere somente de um nome. Por exemplo: “?ertificado”
pode substituir “Certificado”, “certificado” ou qualquer outra combinação de nomes de
arquivos que inicie com um caracter qualquer e termine com “certificado”.

{texto1, Substitui a parte dentro das chaves pelos texto1, depois pelo texto2, assim por diante. Por
texto2...} exemplo: “parte_{a,b,c}” vai resultar em “parte_a”, “parte_b” e “parte_c”.

Exemplos:

$ ls *.txt

Lista todos os arquivos com o sufixo .txt

$ cat doc??? >> documentos

Concatena todos os arquivos iniciados com “doc” que tenham 6 caracteres de tamanho no
arquivo documentos.

cp
$ cp [opções] origem destino

O comando cp copia os arquivos para outros arquivos ou para diretórios. O comando cp pode
copiar um arquivo ou múltiplos arquivos.

As opções mais frequentes são:

-d: Preserva os links ao copiar os arquivo;


-p: Preserva todas as informações dos atributos dos arquivos, como dono do arquivo,
grupo, permissões e data;
-R: Copia os arquivos recursivamente. Útil para copiar os arquivos e diretórios abaixo
do diretório especificado;
264 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

-a: Faz o mesmo que as opções “-dpR” combinadas;


-f: Força a cópia gravando por cima do destino;
-i: Pergunta ao usuário antes de copiar cada arquivo por cima do local de destino;
-v: Mostra o nome de cada arquivo copiado.

Exemplos:

Copia o arquivo1 para arquivo2 no mesmo diretório:

$ cp arquivo1 arquivo2

Copia o arquivo1 para o diretório /tmp:

$ cp arquivo1 /tmp

Copia o arquivo1 localizado no diretório /tmp para o diretório local. O símbolo “.” (ponto)
especifica o diretório como local:

$ cp /tmp/arquivo1 .

Copia todo o conteúdo do diretótio /var/log, incluindo todos os subdiretórios para o diretório
"loglocal":

$ cp –Rf /var/log/ loglocal

mv
$mv [opções] origem destino

O mv move ou renomeia arquivos e diretórios. Ele não altera os atributos dos arquivos ou
diretórios movidos se a transferência for o mesmo sistema de arquivos. Se o destino para
onde os arquivos ou diretórios forem movidos não existir, o comando renomeia a origem,
senão os dados são gravados por cima.

As opções mais frequentes são:

-f: Força a movimentação dos arquivos suprimindo mensagens de confirmação para


gravar por cima.
-i: Pergunta ao usuário antes de mover cada arquivo.

Exemplos:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 265


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Renomeia o arquivo1 para arquivo2:

$ mv arquivo1 arquivo2

Move o arquivo1 para o diretório /tmp:

$ mv arquivo1 /tmp

Você também pode usar o mv com o ".." para mover algo para o diretório superior:

$ mv arquivo1 ../

rm
$ rm [opções] arquivo

O comando rm é utilizado para remover arquivos.

Você precisa ter a permissão de gravação no diretório onde o arquivo está localizado para
removê-lo. Utilizando as opções –R e –f o comando rm remove diretórios.

Em algumas distribuições o comando "rm -i" é utilizado como apelido do comando rm,
forçando sempre confirmar antes de remover.

As opções são:

-f Força a remoção dos arquivos sem perguntar ao usuário.


-r, -R Remove um diretório e todo o seu conteúdo.
-i Pergunta antes de remover
-d, --dir Remove diretórios vazios

Exemplos:

Remove o arquivo1:

$ rm arquivo1

Remove o diretório documentos e todo o seu conteúdo:

$ rm –Rf documentos

266 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Mesmo que um arquivo seja apagado pelo comando rm, é possível


recupera-lo com algumas técnicas avançadas e tempo, uma vez que
o rm apaga os metadados dos arquivos na tabela do sistema de
arquivos, de forma que os inodes ainda podem existir no disco,
permitindo recuperação. Para apagar arquivos de forma virtualmente
irrecuperável, o comando shred deve ser usado.

mkdir
$ mkdir [opcões] diretório

O comando mkdir cria um ou mais diretórios abaixo do diretório local. Você precisa ter
permissões para escrita no diretório para executar o mkdir.

As opções mais frequentes são:

-p: Cria o diretório especificado mesmo que o diretório pai não exista. Neste caso, cria
também o diretório pai;
-m: Configura a permissão do diretório criado. As permissões possíveis são rxwrxwrxw
(veremos mais adiante).
Exemplos:

Cria o diretório documentos:

$ mkdir documentos

Cria o diretório cartas abaixo do diretório documentos. Se documentos não existir, cria-o
primeiro antes do cartas:

$ mkdir –p documentos/cartas

Cria o diretório modelos abaixo do diretório documentos com as permissões de leitura,


escrita e execução para o dono do diretório, seu grupo e outros usuários:

$ mkdir –m 777 documentos/modelos

rmdir
$ rmdir [opções] diretório

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 267


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

O comando rmdir remove um ou mais diretórios vazios do sistema.

As opções mais comuns são:

-p Remove um diretório e seus sub diretórios


--ignore-fail-on-non-empty Ignora o erro em caso do diretório não estar vazio

Exemplos:

Remove o diretório favoritos:

$ rmdir favoritos

Remove os subdiretórios a/b/c/d :

$ rmdir -p a/b/c/d

Tenta remover o diretório musicas, mas ele não está vazio:

$ rmdir musicas
rmdir: falhou em remover “musicas”: Directory not empty

unlink
$ unlink arquivo

O comando unlink pode ser usado para remover arquivos do disco.

Ele funciona como o comando rm, mas sem os avisos que o rm costuma emitir.

O nome do comando unlink deriva do fato dele desconectar a ligação existente entre o nome
do arquivo na tabela de arquivos do sistema de arquivos e o respectivo inode no disco.

Um inode é uma estrutura de dados usada para representar um objeto do sistema de


arquivos, que pode ser uma de várias coisas, incluindo um arquivo ou diretório.

O comando unlink também pode ser usado para desfazer um link criado com o comando "ln".

Exemplo:

$ unlink arquivo

268 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

diff
$ diff arquivos

O comando diff é útil para comparar versões de arquivos, mostrando quais são as diferenças.

Veja os arquivos lista e lista2:

$ cat lista
abacate
arroz
feijão
carne
picanha
tomate

$ cat lista2
abacate
arroz
feijoada
carne
picanha
tomate

O comando diff entre estes dois arquivos produz:

$ diff lista lista2


3c3
< feijão
---
> feijoada

Localizando Arquivos

Os comandos find, locate, updatedb, which e whereis podem ser utilizado para encontrar
arquivos no disco.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 269


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

find
$ find [caminho] [expressão]

O comando find procura por arquivos e diretórios no sistema de arquivos. Dependendo do


tamanho do sistema de arquivos, esse comando pode ser muito demorado.

Sua sintaxe básica é:

$ find [caminho] [expressão]

Você deve indicar um ponto de início da busca na árvore de diretórios do Linux. Se quiser
que ele comece no raiz, indique "/". Se quiser que a busca inicie a partir do diretório corrente,
use como caminho "./" ou simplesmente ".".

O find permite uma infinidade expressões como opções de busca, tais como nome, tamanho,
data de criação de arquivo, data de acesso, por tipo de arquivo, permissões, etc.

Exemplos:

Procura pelo arquivo texto.txt a partir do raiz (/), do tipo arquivo (f):

$ find / -name texto.txt -type f

Procura por todos os arquivos com extensão .txt a partir do diretório corrente (.):

$ find . -name “*.txt”

Procura pelo diretório “usuarios” a partir do diretório corrente, independente se está escrito
com letras maiúsculas ou minúsculas:

$ find . -iname usuarios -type d

Procura por arquivos que não terminam com .html a partir do diretório corrente:

$ find . -type f -not -name “*.html”

O find também permite executar um comando com a lista de arquivos que ele encontrar.
Neste exemplo o find copia todos os arquivos .mp3 encontrados a partir do diretório corrente
para /tmp:

270 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

$ find . -type f -name “*.mp3” -exec cp {} /tmp/ \;

Apaga todos os diretórios BACKUP encontrados a partir do diretório corrente:

$ find . -type d -name BACKUP -exec rm -r {} \;

Procura os arquivos modificados nos últimos 7 dias:

$ find . -mtime -7 -type f

Procura arquivos com permissão 0777:

$ find . -type f -perm 0777 –print

Procura todos os arquivos com mais de 50Mb:

$ find / -size +50M

locate
$ locate arquivo

O comando locate pode ser usado para encontrar arquivos no sistema através de um banco
de dados de arquivos que o comando locate mantém. Como ele faz a busca em uma base de
dados, o resultado é instantâneo. Porém, a base de dados precisa ser atualizada de tempos e
tempos para corresponder com a realidade.

Nem sempre o comando locate é instalado como padrão nas distribuições.

$ locate passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/usr/bin/gpasswd
( ... )

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 271


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

updatedb
$ updatedb

O comando updatedb atualiza a base de dados do locate com o caminho e nome dos
arquivos e diretórios do sistema de arquivos.

A base de dados geralmente fica em /var/lib/slocate/slocate.db e é executada no cron


(sistema de agenda de tarefas).

O updatedb possui um arquivo de configuração em /etc/updatedb.conf. Basicamente este


arquivo informa locais que não devem fazer parte do banco de dados do updatedb.

Geralmente o superusuário root é quem tem permissão para rodar manualmente o updatedb:

# updatedb

whereis
$ whereis palavra

Procura nos diretórios especificados na variável $PATH e $MANPATH por executáveis, código-
fonte ou manuais de uma palavra especificada.

Suas opções mais comuns são:

-b: procura somente por binários;


-m: procura somente por manuais;
-s: procura somente por código-fonte

Exemplo:

$ whereis ifconfig
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz

which
$ which comando

272 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

O comando which recebe como argumento o nome de um comando e trás como resultado a
localização no disco deste comando.Ele é especialmente útil quando você estiver testando
diversas versões de um comando e deseja ter certeza de que está executando a versão
correta.

Exemplo:

$ which httpd
/usr/local/apache/bin/httpd

Links Simbólicos e Hard Links

Os links são arquivos especiais que funcionam como um atalho para outros arquivos e
diretórios. São especialmente úteis quando você deseja espelhar o conteúdo de um arquivo
ou diretório em outro ponto do seu sistema de arquivos.

Os links podem ser de dois tipos:

Links Simbólicos
É um arquivo especial que contém um ponteiro que aponta para outro arquivo. Eles
consomem pouco espaço em disco e possuem a versatilidade de poderem apontar para
arquivos de outro sistema de arquivos, até mesmo quando mapeado de outro computador
em rede.

O link simbólico não tem permissões de acesso próprio, mas assume as permissões do
arquivo original.

Se o arquivo apontado for apagado, o link simbólico fica quebrado, deixando de funcionar.

Podemos fazer uma analogia com o “atalho” do Windows. Os links simbólicos ocupam espaço
em disco, mesmo que pouco.

Hard Links ou Links Físicos


Os links físicos são na verdade cópias de um mesmo arquivo, mas com nomes diferentes e
possivelmente em diretórios diferentes.

Eles possuem em comum o mesmo conteúdo e as mesmas permissões. É como se um


arquivo tivesse dois nomes.

Se o arquivo original é apagado, o link permanece.

Os links físicos somente podem ser criados para arquivos e em um mesmo sistema de
arquivos, já que eles apontam para o mesmo inode do arquivo original.

O comando que cria links simbólicos e físicos é o ln.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 273


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

ln
$ ln [opções] arquivo link

O comando ln pode ser usado para criar links simbólicos ou físicos.

As opções mais utilizadas para o comando ln são:

-s Cria um link simbólico. O padrão do comando ln são links físicos.


-f Força a criação de um link mesmo que este já exista.

Os links simbólicos podem ser criados entre arquivos, ou entre diretórios, mesmo em discos e
sistemas de arquivos diferentes.

Já os links físicos somente podem ser criados entre arquivos de um mesmo sistema de
arquivos em um mesmo volume físico (disco).

Exemplos:

Observe o arquivo quintana, ele tem o contado de links físicos igual a 1:

$ ls -l
-rw-rw-r--. 1 uira uira 177 Set 18 15:09 quintana

Vamos criar o link físico entre arquivo quintana com o nome poema:

$ ln quintana poema

Se observarmos com o ls -l, veremos que o contador de links físicos destes arquivos passou
de 1 para 2.

A contagem de links é a maneira de saber se um arquivo tem um link físico.

$ ls -l
-rw-rw-r--. 2 uira uira 177 Set 18 15:09 poema
-rw-rw-r--. 2 uira uira 177 Set 18 15:09 quintana

Desta forma, é como se o mesmo conjunto de bytes no disco tivessem dois nomes, um
chamado poema e outro chamado quintana. O conteúdo dos dois é o mesmo, e se
alteramos o conteúdo de um, do outro também será alterado, já que o conjunto de bytes do
arquivo é o mesmo.

Observe que ambos os arquivos tem as mesmas permissões, mesmos proprietários, mesmo
tamanho e mesma hora.
274 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

Se o arquivo quintana for apagado, o arquivo poema permanece, e nenhum dado é perdido:

$ rm quintana
$ ls -l
-rw-rw-r--. 1 uira uira 177 Set 18 15:09 poema

Vamos agora criar um link simbólico chamado poesia do arquivo poema:

$ ln -s poema poesia
$ ls -l
-rw-rw-r--. 1 uira uira 177 Set 18 15:09 poema
lrwxrwxrwx. 1 uira uira 5 Set 18 15:20 poesia -> poema

Veja que o link simbólico cria um apontador para o arquivo original. Ele terá sempre as
permissões "lrwxrwxrwx", e seu tamanho será sempre pequeno (5 bytes).

A seta " -> " e o tipo de arquivo "l" indicam que o arquivo se trata de um link simbólico.

Você pode editar e alterar o link simbólico como se estivesse alterando o próprio arquivo,
sem problema algum.

Se você apagar o arquivo original, o link ficará quebrado, e deixará de funcionar. Geralmente
o sistema indica colorindo o arquivo original com fundo preto e o link fica piscando.

$ rm poema

$ ls -l
lrwxrwxrwx. 1 uira uira 5 Set 18 15:20 poesia -> poema

Os links simbólicos ajudam muito a administração do sistema, uma vez que permitem que
"atalhos" para os arquivos sejam criados sem a necessidade direta de se fazer cópias.

O uso de um link físico permite que vários nomes de arquivos sejam associados ao mesmo
arquivo, uma vez que um link físico aponta para o inode de um determinado arquivo. É como
fazer uma cópia, mas sem de fato duplicar o espaço em disco.

Cópia Remota de Arquivos

O Linux também permite a cópia de arquivos remotos através dos comandos scp e rsync.

scp
$ scp origem destino

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 275


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

O comando scp faz a cópia de arquivos de/para computadores remotos utilizando o protocolo
SSH, de forma segura.

O scp pode ser utilizado para enviar ou receber arquivos, dependendo se a origem ou o
destino é um caminho de cópia remoto.

Um caminho remoto tem a seguinte sintaxe: usuário@endereço:/diretório.

Exemplos:

Para copiar o arquivo local /home/uira/arquivo para o servidor.com utilizando as credenciais


do usuário uira:

$ scp /home/uira/arquivo uira@servidor.com:/tmp

Para copiar o arquivo /home/www/arquivo do servidor.com para o diretório local /home/uira:

$ scp uira@servidor.com:/home/www/arquivo /home/uira

rsync
$ rsync [opções] origem destino

O comando rsync é uma ferramenta muito versátil para cópia de arquivos remotos.

O rsync oferece um grande número de opções flexibilizam a forma de copiar arquivos entre
computadores remotos.

Seu uso mais comum é a capacidade de copiar somente os arquivos diferentes entre a
origem e o destino. Desta forma o rsync é amplamente utilizado para backups e
espelhamento de arquivos.

Existem duas maneiras do rsync transferir arquivos: usar um programa de shell remoto,
como ssh ou rsh, ou através do serviço rsync, diretamente via TCP.

Exemplos:

Para copiar apenas os arquivos com extensão pdf que não existem, ou que são diferentes,
para o servidor.com no diretório /home/uira:

$ rsync -t *.pdf servidor.com:/home/uira

Para copiar todos os arquivos do servidor.com do diretório /home/www de forma recursiva


para o diretório local /data/www, copiando as permissões, links simbólicos, atributos e
276 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

propriedade dos arquivos:

$ rsync -avz foo:/home/www /data/www

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 277


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Simulado
2.4 Gerencia de Serviços

O Linux possui dois grandes gerenciadores especiais de carga dos serviços durante o
processo de boot e também responsável por iniciar todos os processos: System V Init
Daemon herdado do Unix e o moderno Systemd.

Atualmente a maioria das distribuições adota o Systemd, de forma que é até difícil encontrar
uma distribuição que ainda use o System V Init para estudar.

O systemd está se transformando num grande "gerenciador de tudo" no Linux, sendo


responsável por iniciar serviços, montar discos, resolver nomes de rede, atualizar o relógio e
até mesmo agendar tarefas.

System V Init Daemon

O System V Init Daemon é um sistema de carga de serviço herdado do UNIX. Também é


conhecido como System Five, por ser a quinta versão do sistema de carga dos serviços, ou
simplesmente init.

Sua função básica é carregar os serviços durante o processo de carga do sistema, tais como
o suporte a rede, multiusuários, apache, mysql, e demais serviços da máquina.

Durante o processo de carga do Linux, o sistema de boot (GRUB) carrega a imagem do kernel
para a memória. Assim que o Kernel assume o controle da máquina, ele carrega um
programa especial chamado init e que sempre tem o PID 1.

A partir daí, todos os outros processos executados na máquina são filhos do processo init.

Isso porque, quando o usuário executa um programa, o kernel faz uma cópia do programa
init através de um método chamado FORK e carrega o código de máquina do programa
desejado em cima do código de máquina do clone do init que foi criado.

Você pode ver essa relação com o comando pstree:

$ pstree -p
init(1)─┬─acpid(3)
├─agetty(4)
├─crond(5)
├─rsyslogd(6)───3*[{rsyslogd}]
├─sshd(7)───sshd(8)───sshd(9)───bash(10)───pstree(11)
└─udevd(12)───2*[udevd]

278 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Como você pode observar, o init tem PID ID igual a 1, e todos os demais processos são filhos
do init.

Runlevels

Os programas ou serviços que o Linux vai executar durante o processo de carga do sistema
ou de desligamento são agrupados em Níveis de Serviço.

No Linux existem sete níveis de execução predefinidos de 0 a 6. Os serviços que cada


runlevel pode executar vão depender da distribuição do Linux e da configuração que o
administrador do sistema efetuou.

Dependendo da distribuição, os diretórios dos Runlevels pode ficar em /etc/init.d/ ou


/etc/rc.d/

TABELA - Runlevels do Linux

Runlevel Descrição Diretório Padrão

0 O nível zero define um desligamento elegante e /etc/init.d/rc0.d ou /etc/rc.d/rc0.d


rápido do sistema.

1,s,single O nível um é utilizado para manutenção do /etc/init.d/rc1.d ou /etc/rc.d/rc1.d


sistema, também chamado de monousuário (single
user). Somente o essencial é executado.

2 Modo multiusuário com compartilhamento de /etc/init.d/rc2.d ou /etc/rc.d/rc2.d


arquivos NFS desabilitado.

3 Modo multiusuário com todos os serviços /etc/init.d/rc3.d ou /etc/rc.d/rc3.d


habilitados, mas sem interface gráfica para o login
no sistema.

4 Não utilizado. /etc/init.d/rc4.d ou /etc/rc.d/rc4.d

5 Modo multiusuário com todos os serviços /etc/init.d/rc5.d ou /etc/rc.d/rc5.d


habilitados, interface gráfica X11 e login em modo
gráfico.

6 O nível seis é parecido com o nível zero, mas /etc/init.d/rc6.d ou /etc/rc.d/rc6.d


executa o reboot da máquina.

Cada diretório de Runlevel contém um ou mais scripts que executam os programas ou


serviços apropriados para cada runlevel.

Por padrão, as distribuições utilizam o nível 0 para uma sequência de desligamento


(shutdown) elegante e o nível 6 para o reboot.

E os runlevels 3 a 5 são utilizados para carga normal do sistema.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 279


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

O nível 1 também conhecido como monousuário é utilizado para manutenções do sistema,


como, por exemplo, recuperar uma partição de dados com problemas.

O administrador do sistema pode a qualquer momento alterar o nível de execução através do


comando init seguido do número do runlevel desejado.

# init 5

ou

# telinit 6

O comando telinit é um link para o init.

É importante saber que a troca de nível de execução pode alterar os processos em execução
e até desligar o sistema.

Definindo Quais Processos Serão


Executados por Cada runlevel

Até agora aprendemos que o comando init pode alterar os processos em execução alterando
os runlevels do sistema. Mas a definição de quais processos serão executados por cada nível
de execução é feita pela hierarquia de diretórios /etc/rc.d e scripts de shell.

Quando o Linux inicia, uma série de scripts no diretório /etc/rc.d é executada para dar a
carga no sistema. O init executa os seguintes arquivos na seguinte ordem:

1. O arquivo rc.sysinit é executado pelo processo init durante a carga do sistema e


habilita funções essenciais. Por exemplo montar as partições de disco;
2. O arquivo rc.local é executado pelo script rc.sysinit. Ele é utilizado pelos
administradores para eles modificarem os serviços na carga do sistema. Este arquivo
tem preferência para esta tarefa uma vez que não é alterado durante um processo de
atualização (upgrade) do sistema;
3. O arquivo rc é utilizado para transições entre os runlevels;
4. O diretório /etc/rc.d/init.d contém os diversos scripts que fazem a carga de todos os
serviços do sistema operacional. Por exemplo o serviço de shell seguro SSH possui um
script para carga do serviço com o nome sshd (Secure Shell Daemon). Este script e
outros scripts podem aceitar como parâmetro comandos como start e stop. Outros
serviços podem aceitar outros comandos como reload, restart, status etc.

Como dissemos anteriormente, os níveis de serviço são definidos através dos diretórios
/etc/rc<n>.d, onde <n> pode variar de 0 a 6, correspondendo aos Runlevels.

Já dentro da cada diretório de Runlevel existem links simbólicos para os scripts dos
serviços nos arquivos em /etc/rc.d/init.d.

280 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Link simbólicos funcionam como os Atalhos do Windows: eles simplesmente apontam para os
arquivos "verdadeiros".

Estes link simbólicos seguem o seguinte padrão:

[K|S]nn[nomedoscript]

Onde:

A letra K, de kill, indica que o script é para terminar um determinado serviço;


A letra S, de start, indica que o script é para carregar um determinado serviço;
Os números inteiros nn indicam a sequência de execução dos scripts, onde o menor
número é executado primeiro. Se existirem no mesmo runlevel serviços com o
mesmo número de ordem de execução, a ordem será indeterminada. A sequência dos
números garante que um serviço que dependa de outro somente seja executado
depois que a dependência seja satisfeita;
O nome do script para o link simbólico não é necessário para o funcionamento
correto, mas para facilitar a leitura humana.

Por exemplo:

# /etc/rc.d/rc3.d/S23httpd -> /etc/rc.d/init.d/httpd

Neste exemplo acima, o link simbólico S23httpd localizado no diretório /etc/rc.d/rc3.d indica
que o script /etc/rc.d/init.d/httpd será executado no Runlevel 3 (multi usuário sem ambiente
gráfico, e será o vigésimo terceiro script a ser executado pelo init durante a carga do
sistema.

Para incluir um determinado serviço em algum Runlevel desejado, você deverá copiar o
script de carga para o diretório /etc/rc.d/init.d e criar um link simbólico para o script no
runlevel desejado seguindo a nomenclatura acima.

Veja o exemplo:

# cp /usr/local/mailman/mailman.sh /etc/rc.d/init.d
# ln -s /etc/rc.d/init.d/mailman.sh /etc/rc.d/rc3.d/S25mailman

Se o script desejado já existir no /etc/rc.d/init.d, você só precisa criar o link simbólico no


Runlevel desejado, e coloca-lo para iniciar depois que algum serviço requerido já estiver sido
carregado. Por exemplo, você só pode colocar o serviço de sshd para rodar depois que o
serviço de rede estiver carregado.

chkconfig
# chkconfig [opções]

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 281


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Outra forma mais elegante de adicionar ou retirar um determinado script ou serviço de um


determinado Runlevel é com o comando chkconfig. O que ele faz é ler o conteúdo dos
diretórios /etc/rc.d, criar ou apagar os links simbólicos.

Para listar quais serviços estão marcados para execução em cada determinado Runlevel, use
o comando chkconfig:

# chkconfig
acpid 0:não 1:não 2:sim 3:sim 4:sim 5:sim 6:não
atd 0:não 1:não 2:não 3:sim 4:sim 5:sim 6:não
httpd 0:não 1:não 2:não 3:não 4:não 5:não 6:não
iptables 0:não 1:não 2:sim 3:sim 4:sim 5:sim 6:não
network 0:não 1:não 2:sim 3:sim 4:sim 5:sim 6:não
ntpd 0:não 1:não 2:sim 3:sim 4:sim 5:sim 6:não
rsyslog 0:não 1:não 2:sim 3:sim 4:sim 5:sim 6:não
sshd 0:não 1:não 2:sim 3:sim 4:sim 5:sim 6:não

Cada coluna representa um Runlevel, começando em 0 até 6.

As opções mais comuns são:

--level x Onde x é o número do Runlevel


Nome do serviço
On ou Off

Para habilitar um serviço no RunLevel 3:

# chkconfig --level 3 httpd on

Para desabilitar um serviço no RunLevel 3:

# chkconfig --level 3 httpd off

service
# service script comando

Para iniciar ou parar um serviço de forma elegante no System V, devemos usar o comando
service.

Ele executa o script indicado pelo parâmetro script localizado em /etc/init.d/script.

Os valores suportados pelo parâmetro comando dependem do script que é chamado. Mas
282 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

via de regra todos os scripts devem suportar pelo menos os comandos de início start e
parada stop.

Veja um exemplo para iniciar o serviço de httpd:

# service httpd start


Starting httpd: [ OK ]

Para verificar se o serviço httpd está funcionando:

# service httpd status


httpd (pid 2124) is running...

E para reiniciar o serviço de httpd:

# service httpd restart


Stopping httpd: [ OK ]
Starting httpd: [ OK ]

Finalmente, para parar o serviço de httpd:

# service httpd stop


Stopping httpd: [ OK ]

O comando service --status-all executa todos os scripts do init, em ordem alfabética, com
o comando status.

# service --status-all
acpid (pid 2428) is running...
atd (pid 13880) is running...
httpd is stopped
rsyslogd (pid 2301) is running...
openssh-daemon (pid 13815) is running...

O comando reload também pode ser usado para que um determinado serviço releia os
arquivos de configuração, sem interromper a operação, como aconteceria com o comando
restart:

# service sshd reload

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 283


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Definindo o Runlevel Padrão

No System V Init, o arquivo que define qual é o runlevel que o sistema assumirá durante a
carga é o /etc/inittab.

O conteúdo deste arquivo pode variar muito dependendo da distribuição, mas o Runlevel
padrão é definido pela linha:

id:n:initdefault

Onde o n definirá o runlevel pelo seu número de 0 a 6. Nunca coloque neste arquivo o
runlevel 0 ou 6 senão o sistema sempre será desligado ou reiniciado.

Você poderá determinar em qual Runlevel o sistema está em execução através do comando
runlevel. Este comando retorna o nível de execução anterior e o nível de execução atual.

Se o nível de execução permaneceu inalterado desde a carga do sistema, o nível anterior


será mostrado como a letra N.

O comando runlevel não altera o nível de execução, mas somente informa. Para alterar
utilize o comando init ou telinit

TABELA - Resumo dos comandos do System V Init

Objetivo Comando

Colocar um script no RunLevel 3 durante a carga # chkconfig --level 3 nomedoscript on


do sistema

Retirar um script do Runlevel 3 da carga do # chkconfig --level 3 nomedoscript off


Sistema

Listar status de carga dos scripts de cada # chkconfig


RunLevel

Iniciar um script # service nomedoscript start

Parar um script # service nomedoscript stop

Reiniciar um script # service nomedoscript restart

Ver o status de um script $ service nomedoscript status

Mudar de Runlevel # init 3


# telinit 3

Alterar o Runlevel padrão Procurar e alterar n na linha que começa com "id" no
arquivo /etc/inittab :
id:n:initdefault

Comandos auxiliares
O Linux ainda possibilita que o desligamento do sistema possa ser o mais elegante possível
284 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

através do comando shutdown e avisar os usuários logados sobre determinada situação com
o comando wall.

shutdown
# shutdown [opções] horário [mensagem]

O comando shutdown é utilizado para desligar ou reiniciar o sistema com horários


determinados. Durante este procedimento, ele desabilita o sistema de login para impedir que
novos usuários entrem no sistema e envia mensagens personalizadas nos terminais para
todos os usuários conectados avisando que o sistema será desligado.

As opções mais frequentes são:

-r Reinicia (reboot) o sistema depois de terminada a sequência de desligamento;


-h Paralisa (halt) o sistema depois de terminada a sequência de desligamento. Não
reinicia a máquina;
-k Manda a mensagem de desligamento, mas não inicia a sequência de
desligamento;
-f Faz a carga de sistema rápida sem a checagem de discos;
-F Força uma checagem dos discos quando for reiniciar o sistema.

Para reiniciar o sistema imediatamente:

# shutdown –r now

Para reiniciar o sistema as 06h da manhã e enviar mensagem no terminal dos usuários:

# shutdown –r 06:00 “Haverá troca de hardware”

A diferença entre trocar o runlevel para 0 ou 6 e o comando shutdown é que o comando


shutdown é administrativamente melhor, pois avisa os usuários que haverá uma parada no
sistema. Já a troca de init não há nenhum tipo de aviso.

Control-Alt-Del
A linha "ca" no arquivo /etc/inittab trata o que acontece quando pressionamos a sequencia
control+alt+del:

ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

E antes de tomar qualquer ação de manutenção ou reinicio do sistema, ainda mais quando se

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 285


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

tratar de um servidor multi-usuário, é elegante que o administrador utilize o utilitário wall


para enviar mensagens para os usuários logados.

Desvantagens do System V init Daemon

Embora o System V init Daemon seja um sistema robusto e utilizado no Kernel 2.4, ele tem
desvantagens, tais como:

Monitoramento dos serviços (daemon) em execução é limitado, gerando processos


zombies;
O reinício de serviços que pararam de funcionar é problemático;
Paralelismo é complicado;
Somente lida com scripts.

Por estas desvantagens, o System V Init não é mais utilizado pelas distribuições.

Systemd

Devido a várias limitações do init, outro sistema especial de controle dos processos de boot e
gerência da execução dos programas foi criado e denominado systemd.

Este novo sistema já é amplamente utilizado nas distribuições mais conhecidas,


especialmente nas versões de Kernel superiores a 2.6.

Sua principal vantagem é a carga do sistema de forma mais rápida, executando os serviços e
processos em paralelo. Isso foi possível com a chegada dos novos processadores dotados de
múltiplos núcleos, que permitem a execução de diversas threads em paralelo.

Entre as novidades do systemd, estão:

Ativação via socket e bus (executa os serviços sob demanda);


Melhor paralelização dos processos;
Uso de cgroups (control groups – grupos de controle) ao invés de PIDS;
Suporta criação de imagens de estado de memória para salvar e restaurar estados de
execução.

O sistema de controle de grupos permite que o systemd supervisione os processos, de forma


a garantir que, quando um serviço é parado, todos os processos filhos, netos, bisnetos etc.
também sejam parados.

Com um gerenciamento mais robusto, mais ciclos de CPU são necessários para a criação de
novos processos. Mas devido ao alto desempenho dos processadores, isto não parece ser um
problema para o systemd.

No systemd, a carga de processos, mudança de runlevel e scripts de carga são bem


286 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

diferentes do init.

Para começar, o Systemd trata os Runlevens como Targets ou alvos. Cada Target pode ter
várias Units.

Entenda as Units como objetos que são lidos pelo Systemd. Esses objetos são arquivos de
configuração que definem por exemplo:

Nome do objeto
Pré-requisitos para execução (se dependem de outras Units)
O que deve ser feito, por exemplo, rodar um determinado programa ou serviço
O que deve ser feito depois que o comando for iniciado.

Esses arquivos são bem abrangentes, e podem definir uma série de coisas dependendo do
seu tipo. As Units mais comuns do Systemd são:

Tipo de serviço (service): usado para gerenciar um serviço ou aplicativo no


servidor. Isso incluirá como iniciar ou interromper o serviço, sob quais circunstâncias
ele deve ser iniciado automaticamente e as informações de dependência e pedido do
software relacionado. São arquivos com extensão .service
Tipo de ponto de montagem (mount): Esta unidade define um ponto de
montagem no sistema a ser gerenciado pelo systemd. São arquivos com a extensão
.mount
Tipo de tempo (timer): define que algo será gerenciado pelo systemd, semelhante
a um trabalho cron, para ativação atrasada ou agendada.São arquivos com a
extensão .timer

Veja uma tabela comparativa de Runlevel (System V) e Targets do Systemd:

TABELA - Runlevels do Linux

Runlevel Descrição Target

0 O nível zero define um desligamento elegante e poweroff.target


rápido do sistema.

1 Manutenção do Sistema rescue.target

2 Padrão multi-usuário modo texto multi-user.target

3 Padrão multi-usuário modo texto multi-user.target

4 Padrão multi-usuário modo texto multi-user.target

5 Padrão multi-usuário modo gráfico graphical.target

6 Reboot da máquina reboot.target

A sintaxe dos arquivos de configuração do Systemd, chamados de unidades, é inspirada nos

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 287


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

arquivos .ini do Windows. Estes arquivos são encontrados em dois diretórios, a saber:

/usr/lib/systemd/system/: Unidades provenientes de pacotes de software instalados;

/etc/systemd/system/: Unidades instaladas pelo administrador;

Modo de Emergência e Resgate


Dois alvos especiais extra são resgate e emergência.

Rescue.target

O modo de resgate ou recuperação pode ser usando para uma manutenção do sistema mais
"leve". Neste modo o sistema:

Monta todos os sistemas de arquivos locais;


Somente o usuário root tem permissão para fazer login no sistema;
Os serviços de rede são desativados e apenas alguns outros serviços são iniciados;
O comando systemctl is-system-running retornará o status de manutenção.

Neste modo é possível executar utilitários de disco como o fsck ou xfs_repair para corrigir
discos corrompidos. Este modo é util para corrigir também falhas nas configurações do
sistema, ou de serviços.

Emergency.target

O target de Emergência é para uma manutenção pesada, quando muita coisa dá errado,
geralmente com dados corrompidos. Neste modo o sistema:

Monta apenas o sistema de arquivos raiz como somente leitura;


Semelhante ao modo de recuperação, ele só permite que o usuário root faça login no
sistema;
Os serviços de rede são desativados e apenas alguns outros serviços são iniciados;
O comando systemctl is-system-running retornará o status de manutenção.

Se o sistema entrar em modo de emergência sem dúvidas há sérios problemas. Este modo é
usado para situações em que até mesmo o modo de resgate não funciona.

systemctl
$ systemctl [opções] comando [nome]

O comando systemctl é quem comanda o show do sistema de gerenciamento de serviços do


systemd. Os comandos possíveis são:

288 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Comando Ação

list-units Lista as units conhecidas

list-sockets Lista as units do tipo socket

list-timers Lista as units do tipo timer

start NOME Inicia uma ou mais units informadas em NOME

stop NOME Parauma ou mais units informadas em NOME

reload NOME Recarrega as configurações de uma ou mais units informadas

restart NOME Reiniciauma ou mais units informadas em NOME

try-restart NOME Reinicia as units se estiverem em execução. Faz nada se não estiverem rodando

isolate NOME Inicia todas as unidades especificadas e suas dependências, e para todas as outras.
Usado para mudança de target

status [NOME] Mostra o status de uma unidade ou de todas se nada for especificado

show [NOME] Mostra as propriedades de uma ou mais unidades

cat NOME Mostra os arquivos de uma unidade

enable NOME Habilita uma unidade para carga durante o boot. Não inicia uma unidade

disable NOME Desabilita uma unidade para carga durante o boot. Não para a unidade

daemon-reload Reinicia o serviço do systemd.

mask NOME Coloca o serviço do limbo, impossibilitando a sua execução.

unmask NOME Retorna o serviço do limbo, possibilitando que seja iniciado.

Para o exame, não precisa saber criar, editar ou alterar qualquer unit. Basta saber listar as
units, iniciar, parar, habilitar, desabilitar, ver o status e mudar de Runlevel.

Você pode ou não especificar a extensão das unidades (.target / .service / .timer) ao passar o
comando. O systemctl sempre vai procurar por um padrão indicado no NOME.

Desta forma, para verificar o serviço de cron (agendador) pode-se usar o comando status
seguido do nome da unit cron com ou sem a extensão ".service":

# systemctl status cron

Ou

# systemctl status cron.service


cron.service - Command Scheduler
Loaded: loaded (/lib/systemd/system/cron.service;

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 289


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

enabled)
Active: active (running) since Mon, 28 May 2012
18:09:57
Main PID: 673 (cron)
CGroup: name=systemd:/system/cron.service
+ 673 /usr/sbin/cron -n

Para parar um serviço:

# systemctl stop cron.service

Veja o status do serviço quando parado:

# systemctl status cron.service


cron.service - Command Scheduler
Loaded: loaded (/lib/systemd/system/cron.service;
enabled)
Active: inactive (dead) since Mon, 28 May 2012
18:18:26
Main PID: 673 (code=exited, status=0/SUCCESS)
CGroup: name=systemd:/system/cron.service

Para iniciar um serviço:

# systemctl start cron.service

Para reiniciar um serviço:

# systemctl restart cron.service

Para habilitar um serviço durante a carga do sistema, usa-se o comando enable:

# systemctl enable cron.service

Para desabilitar um serviço durante a carga do sistema, usa-se o comando disable:

# systemctl disable cron.service

Para mudar o runlevel para o modo texto (runlevel 3), usa-se o comando isolate

290 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

# systemctl isolate multi-user.target

Para mudar o runlevel para o modo gráfico (runlevel 5):

# systemctl isolate graphical.target

Para ver qual o runlevel que está em execução, pode-se usar o comando get-default:

$ systemctl get-default
graphical.target

Para alterar o runlevel padrão há duas maneiras:

A primeira é excluir e recriar o link simbólico manualmente:

a) Para excluir o link simbólico:

# rm /etc/systemd/system/default.target

b) Para colocar o runlevel3 como padrão, recriar o link simbólico:

# ln -sf /lib/systemd/system/multi-user.target
/etc/systemd/system/default.target

A segunda maneira é usar o systemctl para fazer isso por você, com o comando set-default:

# systemctl set-default multi-user.target


Removed /etc/systemd/system/default.target.
Created symlink /etc/systemd/system/default.target ->
/usr/lib/systemd/system/multi-user.target.

Para ver quais units um determinado serviço é dependente, pode-se usar o comando list-
dependencies:

$ systemctl list-dependencies apache2


apache2.service
● ├─-.mount
● ├─system.slice
● └─sysinit.target
● ├─apparmor.service
● ├─dev-hugepages.mount

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 291


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

● ├─dev-mqueue.mount
● ├─keyboard-setup.service
● ├─kmod-static-nodes.service
( ... )

É importante dizer que quando um determinado serviço é iniciado pelo systemd, o


gerenciador iniciará também todas as dependências que aquele determinado serviço requer.

Por exemplo, se o serviço system.slice estiver parado e desabilitado, e o administrador


iniciar o serviço do apache2, o serviço system.slice será iniciado, para que o serviço
apache2 funcione corretamente.

Para evitar que um serviço seja executado, mesmo que esteja desabilitado, e faça parte de
dependência de alguma unit, o comando mask pode ser usado:

# systemctl mask apache2


Created symlink /etc/systemd/system/apache2.service → /dev/null.

Desta forma, o systemctl irá criar um link simbólico do serviço para o limbo /dev/null. Assim,
o serviço não será iniciado de forma alguma, mesmo que seja dependência de outra unit:

# systemctl start apache2


Failed to start apache2.service: Unit apache2.service is masked.

Para voltar o serviço, o comando unmask pode executado, retornando a unidade do exílio:

# systemctl unmask apache2


Removed /etc/systemd/system/apache2.service.

Toda a vez que for criada ou alterada alguma unit, é necessário reiniciar o serviço do
Systemd com o comando daemon-reload:

# systemctl daemon-reload

O systemd mantém certa compatibilidade com o System V, através de um script que imita do
comando service, que, na verdade, executa comandos do systemctl.

292 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Systemd Mount Units

Como dito anteriormente, o systemd é um conjunto de software de gerenciamento dos


serviços no siostema Linux. É um sistema de inicialização, portanto, o primeiro processo a ser
iniciado (com o pid 1).

Ele irá gerenciar os serviços do sistema, executar tarefas agendadas, montar discos, habilitar
serviços de rede, etc.

Entre as possibilidades que o systemd gerencia, existem unidades chamadas de Mount, que
descrevem pontos de montagem que o systemd faz durante o processo de carga do sistema,
sem a necessidade do /etc/fstab. Ele também tem unidades chamadas de .swap que lidam
com as partições de swap.

Essas unidades de montagem são arquivos com extensão .mount ou .automount,


geralmente localizados no diretório /etc/systemd/system.

Desta forma, é importante que você tenha noção que o systemd também é capaz de montar
discos e partições de swap.

Veja o exemplo de uma unidade de montagem:

Description=Additional drive
[Mount]
What=/dev/disk/by-uuid/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Where=/mnt/driveone
Type=ext4
Options=defaults
[Install]
WantedBy=multi-user.target

Se você perceber, o texto destacado assemelha-se muito as opções de montagem do arquivo


/etc/fstab, pois contem o disco ou partição que será montada (WHAT), onde será o ponto de
montagem (WHERE), o tipo de sistema de arquivos (TYPE) e os parâmetros (OPTIONS).

Desta forma, é bem possível que o Linux faça uso das units de montagem ao invés do
/etc/fstab para montar seus discos.

hostnamectl
# hostnamectl comando parâmetro

O utilitário hostnamectl pode ser usado para consultar e alterar o nome do host do sistema e as
configurações relacionadas.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 293


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Esta ferramenta distingue três nomes de host diferentes: o nome de host “bonito” de alto
nível que pode incluir todos os tipos de caracteres especiais (por exemplo, “Laptop do Uirá”),
o nome de host estático que é usado para inicializar o nome do host do kernel na
inicialização (por exemplo, “uira-laptop”), e o hostname transiente que é um nome de
backup recebido da configuração de rede.

Observe que o nome de host bonito tem poucas restrições sobre os caracteres e
comprimento, enquanto os nomes de host estáticos e transitórios são limitados aos
caracteres geralmente aceitos em nomes de domínio da Internet, e no máximo 64 caracteres
(limitação do Linux).

O nome do host estático é armazenado em /etc/hostname.

O nome do host bonito, o tipo de chassi e o nome do ícone são armazenados


em /etc/machine-info.

Veja o exemplo:

Se não for informado nenhum parâmetro, o comando hostnamectl vai mostrar o "status" do
host.

$ hostnamectl
Static hostname: ubuntu
Icon name: computer-vm
Chassis: vm
Machine ID: de5040dbad4c124db4379433293750ce
Boot ID: 029f1be008cb4fed8322e6d87fcae2ac
Virtualization: kvm
Operating System: Ubuntu 19.04
Kernel: Linux 5.0.0-13-generic
Architecture: x86-64

A opção set-hostname NOME pode ser usada para alterar o hostname para o NOME
especificado. Por padrão, irá alterar tanto o hostname "bonito", quanto o transiente e o
estático. Entretanto, pode-se usar as opções --static, --transient e --pretty para configurar
um destes hostnames separadamente:

$ sudo hostnamectl set-hostname Notebook-do-Uira

$ hostnamectl status
Static hostname: Notebook-do-Uira
Icon name: computer-vm
Chassis: vm
Machine ID: de5040dbad4c124db4379433293750ce
Boot ID: 029f1be008cb4fed8322e6d87fcae2ac
Virtualization: kvm
294 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

Operating System: Ubuntu 19.04


Kernel: Linux 5.0.0-13-generic
Architecture: x86-64

A opção set-chassi TIPO pode ser usada para definir o tipo de chassi em aplicações
gráficas. O TIPO pode ser: "desktop", "laptop", "convertible", "server", "tablet", "handset",
"watch", "embedded" e "vm".

O comando hostnamectl é capaz de alterar os arquivos /etc/hostname e /etc/machine-


info.

systemd-analyze
$ systemd-analyze

O comando systemd-analyze pode ser utilizado para dizer quanto tempo o sistema demorou
para dar carga.

Ele pode dizer o desempenho de cada componente da carga do sistema.

Exemplos:

$ systemd-analyze time
Startup finished in 2.850s (kernel) + 35.950s (userspace) =
38.801s
graphical.target reached after 9.283s in userspace

Neste exemplo, o comando disse que o Kernel demorou 2,8 segundos, e que os serviços
depois do kernel demoraram 35,9 segundos. E que o ambiente gráfico demorou 9,2 segundos
para entrar assim que o kernel foi carregado.

O comando systemd-analyze deixa claro a grande vantagem do carregamento dos processos


em paralelo do systemd em relação ao System V.

É possível ainda depurar com mais detalhes o tempo de resposta de cada um dos serviços do
systemd com o comando systemd-analyze blame:

$ systemd-analyze blame
16.267s motd-news.service
13.023s apt-daily.service
7.381s plymouth-quit-wait.service
5.468s dev-sda1.device
2.383s apt-daily-upgrade.service
2.240s snapd.service
1.756s postfix@-.service

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 295


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

( ... )

Comparação entre System V e Systemd

Veja o Resumo dos comandos do System V Init x Systemd, em comparação:

Objetivo Comando no System V Init Comando no Systemd

Colocar um script no # chkconfig --level 3 # systemctl enable nomedoservico.service


RunLevel 3 durante a nomedoscript on
carga do sistema

Retirar um script do # chkconfig --level 3 # systemctl disable nomedoservico.service


Runlevel 3 da carga do nomedoscript off
Sistema

Listar status de carga dos # chkconfig # systemctl


scripts de cada RunLevel

Iniciar um script # service nomedoscript start # systemctl start nomedoservico.service

Parar um script # service nomedoscript stop # systemctl stop nomedoservico.service

Reiniciar um script # service nomedoscript restart # systemctl restart nomedoservico.service

Ver o status de um script $ service nomedoscript status # systemctl status nomedoservico.service

Mudar de Runlevel # init 3 # systemctl isolate nomedotarget.target


# telinit 3

Alterar o Runlevel padrão Procurar e alterar n na linha que # systemctl set-default


começa com "id" no arquivo nomedotarget.target
/etc/inittab :
id:n:initdefault

Fique atento que o comando service e systemctl invertem a ordem do comando (start, stop,
restart, etc) e o nome do serviço (httpd, cron, mysql, etc).

296 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Simulado
2.5 Linux como Servidor

Enquanto o Linux nunca conseguiu um relativo sucesso no mundo dos computadores


Desktop, com toda a certeza ele domina o mundo dos servidores e dispositivos móveis.

Segundo dados da W3Cook, em Julho de 2015, 96,4% dos computadores servidores


conectados à Internet eram servidos com Linux. E dos 500 supercomputadores, todos eles
rodam Linux.

No mundo Mobile, 40,44% dos acessos à Internet em setembro de 2019 foram feitos com
dispositivos rodando Android.

Como sistema operacional, não há muita diferença entre um Linux Desktop que roda em um
Notebook e um Linux servidor que executa numa máquina em algum gabinete em um Rack
de servidores. Ambos tem o mesmo Kernel, e são capazes de executar as mesmas
aplicações.

A diferença está nas aplicações que estão instaladas no Linux, e como estas aplicações
executam no sistema.

Enquanto um Linux voltado para Desktop executa aplicações pessoais, geralmente em


ambiente gráfico, com muita interação com usuário, o Linux Servidor foi desenhado para ter
nenhuma interação direta com o usuário, nem mesmo na maioria das vezes há um terminal
conectado.

Os servidores são especificamente feitos para executar programas que vão prover serviços
para os usuários, geralmente via rede. Estes programas geralmente são executados como
serviços do sistema, em modo texto, no Shell do Linux.

Hoje, a maioria das aplicações são feitas para funcionar em ambiente Web ou Mobile, e o
Linux atua a fornecer um Servidor Web ou provendo serviços de processamento de dados
para os dispositivos móveis.

Os programas que são executados no Linux na forma de serviços, são chamados de


daemon. Neste exemplo, o servidor Web Apache Web Server está em execução como um
serviço do sistema:

$ ps ax | grep apache2
23509 ? Ss 0:02 /usr/sbin/apache2 -k start
23510 ? Sl 0:00 /usr/sbin/apache2 -k start
23511 ? Sl 0:00 /usr/sbin/apache2 -k start

A princípio, do ponto de vista dos programas em execução, não há como diferenciar se um


programa é um serviço ou de usuário, como um editor de textos. A diferença está no fato do

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 297


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

programa estar conectado a um terminal ou não. O comando "ps -e" evidencia isso:

$ ps -e
PID TTY TIME CMD
1 ? 00:00:09 systemd
11907 ? 00:00:00 sshd
11908 pts/1 00:00:00 bash
23509 ? 00:00:02 apache2
23510 ? 00:00:00 apache2
23511 ? 00:00:00 apache2

Observe que os programas systemd, sshd e apache2 não tem um terminal ligado a eles. Já o
programa bash que é o shell de interação com usuário, está ligado ao pseudo-terminal pts/1.

Protocolos e Portas de Comunicação


Quando se fala de aplicações que proveem serviços no Linux, a maioria delas fornece os seus
serviços através da rede. E quando isso acontece, há por trás de cada aplicação um protocolo
que estabelece como a comunicação entre o programa servidor e programa cliente se dará.

Esse protocolo de comunicação geralmente é padronizado por um comitê e publicado na


Internet. O Internet Engineering Task Force (IETF) trabalha para padronizar os protocolos
utilizados na Internet, e publica como devem funcionar em documentos chamados de
Request for Comments (RFC).

Desta forma, um desenvolvedor de posse de um RFC pode programar a sua própria


implementação do protocolo, ou utilizar alguma biblioteca na linguagem de programação que
escolheu que tenha o protocolo implementado na forma de algum objeto, função ou
procedimento.

Um servidor web, por exemplo, utiliza os protocolos HTTP e HTTPS para se comunicar com
um navegador como o Chrome ou Firefox. Já um servidor de e-mails utiliza os protocolos
IMAP e SMTP para receber e enviar e-mails entre os clientes de e-mail. Cada aplicação fará
uso de um protocolo específico para oferecer o seu serviço na rede.

No nível do sistema operacional, os programas servidores geralmente também utilizam


algum protocolo de rede na camada de transporte (TCP e UDP) para fazer a comunicação dos
protocolos da camada de aplicação (HTTP, HTTPS, IMAP, SMTP, etc).

Como cada protocolo da camada de aplicação utiliza a mesma camada de transporte (TCP e
UDP), é necessário que os protocolos de aplicação sejam separados por portas de
comunicação.

Assim, o IETF definiu um conjunto de portas de comunicação que representam um conjunto


de protocolos de aplicação conhecidos. Essas portas são números de 1 até 65535, e cada
uma delas representa um protocolo.

Um subconjunto de portas que vai de 1 até 1024 é conhecido como "Portas bem conhecidas",
que estabelecem serviços e protocolos importantes.
298 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

No Linux, as portas e seus respectivos protocolos são listados no arquivo /etc/services:

$ cat /etc/services
tcpmux 1/tcp
echo 7/tcp
echo 7/udp
discard 9/tcp

A seguir descreveremos as aplicações de servidor Linux comuns por tipo.

Servidores Web
Apache HTTP Server

Um dos primeiros e mais populares servidores é o Apache Web Server, desenvolvido pelo
Centro Nacional de Aplicações de Supercomputadores (NCSA). Sua popularidade se deve a
sua modularidade, de forma que as suas funcionalidades podem ser habilitadas na forma de
plug-in. Com isso, ele se torna bem versátil, e economiza CPU e recursos.

NGINX

O NGINX é um servidor web lançado em 2004 com o objetivo de substituir o Apache, com
desempenho melhorado, principalmente para páginas estáticas. Ele também tem
funcionalidades adicionais, podendo atuar como web proxy, mail proxy, cachê de páginas
web e também como balanceador de carga.

O uso de memória do Nginx é bem menor que no Apache, podendo lidar com mais de 10.000
clientes simultaneamente.

Servidores de Banco de Dados


O Linux é bem seguro e largamente utilizado para hospedar aplicações de servidores de
banco de dados. Seu sistema de arquivo robusto e confiável é ideal para armazenar os
arquivos grandes dos gerenciadores de banco de dados.

Oracle Database

O banco de dados relacional da Oracle foi um dos primeiros bancos de dados a ser
largamente utilizado por empresas, e há até uma distribuição Linux da própria Oracle
customizada para hospedar seu banco de dados.

MySQL

O MySQL foi um dos primeiros banco de dados relacionais de código livre, provendo serviços
de banco de dados de forma rápida e simples. Sua combinação com servidores Web, como o
Apache, e com a linguagem de programação PHP foi explosiva e decisiva para a ascensão
das aplicações web. Esta combinação ficou conhecida como LAMP (Linux Apache MySQL e
PHP).

Há poucos anos o MySQL foi comprado pela Oracle e uma versão comercial aprimorada foi

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 299


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

lançada, mas mantendo uma versão mais simples comunitária.

Parte dos desenvolvedores do projeto original do MySQL fizeram um novo banco de dados
aproveitando tudo que tinham do MySQL e chamaram de MariaDB, que comunga com os
princípios do software livre.

PostgreSQL

O PostgreSQL é outro banco de dados relacional de código aberto que sempre teve como
objetivo rivalizar com os softwares comerciais, trazendo características que geralmente são
encontradas somente em softwares comerciais de alto custo. Seu uso nunca foi grande no
mundo web, devido a sua má reputação de ser lento.

MongoDB

O MongoDB é um banco de dados não relacional, que armazena dados com o método NoSQL.
Ele não usa tabelas como os banco de dados relacionais, mas sim em documentos com
elementos independentes, no formato JSON (Javascript Object Notation).

Mesmo não sendo relacional, o MongoDB suporta indexes, consultas, replicação e


balanceamento de carga. Seu uso em sites que utilizam o Javascript é o casamento perfeito.

Servidores de E-Mail
Uma das primeiras aplicações servidoras que o Linux hospedou na Internet é o serviço de e-
mail. Ao invés de utilizar aplicações monolíticas para receber e enviar e-mails, o Linux utiliza
uma série de programas, que juntos servem para enviar e-mails entre os servidores, receber
e-mails dos clientes, enviar e-mails para os clientes e armazenar as mensagens.

Os principais softwares de servidores e-mail no Linux são:

Sendmail: o mais antigo software de serviço de e-mail da Internet, com muitas


funcionalidades interessantes, mas bem complexo para ser configurado a mão.
Postfix: sua principal característica é a simplicidade. Foi escrito para ser modular e de
fácil configuração. Bem popular em pequenos servidores de e-mail.
Exim: bem completo, e menos complexo que o sendmail.

NTP - Network Time Protocol


O serviço de NTP serve para ajustar o relógio local do Linux, bem como o relógio de diversos
compuladores ligados em rede. Ele utiliza uma rede de servidores na Internet que utilizam
relógio atômico para contar o tempo de forma exata. Este tipo de serviço é essencial para os
computadores, uma vez que seus relógios contam o tempo através de software que pode
sofrer um "escorregamento" da hora, deixando o sistema com o relógio atrasado. Estar com
o relógio certo é necessário para os serviços de autenticação de usuários.

No Linux, os pacotes Chrony ou NTPD geralmente são utilizados como serviço de NTP.

300 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

DHCP - Dynamic Host Configuration Protocol


O serviço de DHCP é essencial para controlar e distribuir endereços IP de forma dinâmica em
uma rede local ou WIFI. Este serviço é responsável por autenticar os dispositivos na rede, e
prover um endereço IP local para os computadores e dispositivos conectados. É tão essencial
esse tipo de serviço que costuma vir embarcado em modems de Internet caseiros. No
entanto, em redes corporativas, este tipo de serviço geralmente é amarrado junto com
algum serviço de autenticação de usuários. O Linux possui vários pacotes que atuam como
servidores de DHCP, tais como dhcpd e pump.

DNS - Resolução de Nomes


O serviço de resolução de nomes DNS é responsável por resolver um endereço de Internet
(ex: www.certificacaolinux.com.br) em um endereço IP de algum servidor responsável por
prover algum tipo de serviço para este endereço. O pacote mais popular para prover a
resolução de nomes no Linux é o Bind. Este servidor faz a tradução de endereços por IPs na
rede utilizando uma rede de servidores DNS, que fazem a tradução dos endereços de forma
descentralizada.

É comum nas redes locais uma das máquinas atuarem como servidor de DNS para as demais
máquinas na rede, de forma que é feito um cachê local dos nomes de rede já resolvidos,
evitando assim novas consultas pela Internet.

O serviço do Systemd no Linux também utiliza um serviço de resolução de nomes local


chamado Systemd-Resolved, que faz a resolução de nomes e cachê local

Servidor de Arquivos
O Linux pode atuar como um confiável servidor de arquivos para usuários e máquinas em
uma rede local ou em nuvem. Há várias maneiras do Linux servir arquivos em uma rede,
através de diferentes maneiras e pacotes de software:

Web: O linux pode atuar com um servidor Web preparado para servir arquivos via
páginas de Internet;
NFS: Network FIle Systems é um sistema de compartilhamento de pastas largamente
utilizado no Linux e Unix;
SAMBA: O serviço de SAMBA é um sistema de compartilhamento de pastas e
impressoras utilizado no Linux para compartilhar volumes entre máquinas Windows e
Linux;

Servidores de Impressão
O Linux também pode atuar como servidor de Impressão, controlando uma ou mais
impressoras locais, com serviços de autenticação e controle de impressões. O pacote mais
popular no Linux para este serviço é o CUPS.

Web Proxy e Cachê


O serviço de web proxy é utilizado para interceptar as requisições de páginas de Internet de

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 301


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

máquinas conectadas em uma rede local, com o objetivo de prover controle de uso de
Internet, liberando ou não o acesso a algum site, baseado em uma lista de controle de
acesso por máquina, usuário, horário, etc. Além de controlar o acesso à Internet, o servidor
de proxy geralmente também atua como um cachê local de objetos de Internet (páginas,
imagens, js, css, etc) de forma que uma segunda requisição para um mesmo site seja bem
mais rápida, economizando tempo e largura de banda do link de Internet. Existem
distribuições Linux especialmente desenvolvidas para atuar como Web Proxy e Firewall de
Internet. O pacote Linux mais popular para serviço de Web proxy é o squid.

Autenticação
O serviço de autenticação de usuários pode ser fornecido pelo Linux de diversas maneiras
diferentes.

Em termos de autenticação de usuários locais, o Linux utiliza o esquema de controle de


contas e autenticação por senha localmente usando os arquivos /etc/passwd e /etc/shadow.

No entanto, o Linux pode ser utilizado para autenticar usuários para uma rede local,
utilizando os servidores de SAMBA, KEBEROS e LDAP:

Keberos

Desenvolvido pelo MIT, o sistema de autenticação do Keberos utiliza chaves criptografadas


para fazer a autenticação de usuários, tanto em aplicações locais ou através de plug-ins que
podem ser utilizados em diveras aplicações para autenticar seus usuários.

SAMBA

O Samba pode prover serviços de autenticação de usuários em uma rede, imitando os


serviços de autenticação do Microsoft Windows Server, atuando como um servidor de
autenticação de domínio de um Microsoft Active Directory.

LDAP

O serviço de LDAP foi primeiramente utilzado comercialmente pela Microsoft para prover
serviço de Diretório, concentrando os objetos de uma rede (máquinas, impressoras, usuários)
em um só local, em um esquema hierárquico. Os objetos na rede podem ser agrupados por
alguma lógica que faça sentido, como por exemplo, divisão por departamentos, e as
propriedades dos objetos também são armazenadas no LDAP. Um objeto de conta de usuário
pode conter seu nome, email, telefone, local de trabalho, login na rede, etc. O Linux possui
um pacote muito bom para prover o serviço de diretório com o OpenLDAP.

VPN - Virtual Private Network


O serviço de VPN é essencial para prover conexão remota via Internet à uma rede local, de
forma segura e criptografada. Uma vez conectado a uma VPN, um dispositivo cliente (mobile
ou desktop) pode ter acesso a dados e serviços sensíveis, cujo acesso direto via Internet não
seja comercialmente apropriado. Via VPN um usuário pode ter acesso a um servidor de
arquivos, web ou de aplicações da empresa de forma segura, uma vez que existe uma
autenticação por chaves envolvida, e também criptografia dos dados. O pacote popular no
Linux para fornecer VPN é o OpenVPN.
302 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

Monitoramento
O serviço de monitoramento no Linux serve para monitorar servidores e aplicações, de forma
que o administrador fique sabendo quando um evento importante aconteceu, como por
exemplo falha ou indisponibilidade de algum serviço. Os servidores de monitoramento
podem se conectar diretamente em um serviço, como por exemplo um servidor web, banco
de dados, etc, para testar se o serviço está funcionando, ou através de um protocolo especial
chamado SNMP (Simple Network Management Protocol), implementado em diversos
dispositivos, servidores e aplicações para difundir na rede o status dos seus ativos. Este
protocolo é implementado geralmente em dispositivos de rede, como roteadores, switches,
modems e outros equipamentos.

No Linux, os pacotes de software NAGIOS e ZABBIX são populares para monitorar servidores,
aplicações e equipamentos de rede.

Logging
O serviço de Logging servidodo junto com os serviços de autenticação e monitoramento. Ele
fornece um jornal de log de eventos de sistema, usuários e aplicativos, guardando
informações das situações importantes, para posterior consulta e depuração de problemas. O
Linux possui um jornal de Logging nativo no Systemd, bem como serviços de Log herdados
do Unix, como o Syslog e SyslogNG. Estes servidores de LOG podem armazenar as
informações sobre os eventos da máquina Linux localmente, bem como armazenar eventos
de dispositivos remotos.

Autoridade de Certificado
O serviço de autoridade de certificado se tornou comum na Internet para autenticação de
usuários. Os certificados atuam como um método de autenticação por 2 fatores. A
autenticação por 2 fatores utiliza dois métodos diferentes para autenticar um usuário.
Geralmente envolve o usuário apresentar algo que ele tenha (como um certificado, ou uma
senha gerada por algum dispositivo ou algum cartão de combinações) e algo que ele saiba
(como uma senha pessoal). Os dois fatores fortalecem a autenticação, pois é necessário
apresentar os dois fatores.

A autoridade de certificado é utilizada pelos governos e bancos, para autenticar pessoas


físicas e jurídicas, e prover serviços governamentais e financeiros através da Internet. No
Brasil existem vários tipos de certificado como o e-CNPJ e e-CPF.

Os certificados são emitidos por autoridades de certificado, que são empresas que conferem
a documentação de uma empresa ou pessoa, e então emitir um certificado. O certificado
então pode ser verificado através de uma cadeia de servidores, que atestam sua
autenticidade.

Na Internet também existem certificados SSL que fornecem autenticidade (o site é quem diz
que é) e criptografia ponta a ponta.

O pacote OpenSSL no Linux é capaz de prover os serviços de emissão e reconhecimento de


certificados, bem como de SSL para os serviços de web.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 303


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

SSH - Secure Shell


O serviço de ssh é bem comum em servidores Linux, e provê acesso remoto ao shell do Linux
com criptografia. Geralmente este serviço opera na porta 22 TCP em máquinas Linux. O
pacote que provê o serviço de ssh é o OpenSSH, que contém a aplicação servidora sshd, e o
cliente ssh para fazer conexão remota. É incomum prover o serviço de ssh para usuários
comuns, sendo mais utilizado pelos administradores de sistema.

Clustering
O clustering é a divisão da carga de processamento em diversos servidores que atuam como
irmãos gêmeos, provendo os mesmos serviços, com as mesmas aplicações. Dependendo da
aplicação, é necessário que os servidores em cluster compartilhem alguma informação de
sessão, como autenticação de usuários, etc. Este tipo de topologia permite que um
determinado serviço seja distribuído em diversos servidores para aumentar a sua
confiabilidade e disponibilidade.

Balanceamento de Carga
O serviço de balanceamento de carga é inerente ao serviço de clustering, uma vez que pode
ser necessário que algum agente na rede atue dividindo a carga ou o processamento entre
os servidores em clustering. O tipo de software que vai fazer o balanceamento de carga
depende do tipo de aplicação. O mais comum é balanceamento de servidores web, que pode
ser feito com um proxy reverso, ou com servidor web configurado para tal.

Conteineres
Um dos grandes problemas do desenvolvimento de software é garantir que o software que
funcionou como esperado no ambiente de desenvolvimento funcione da mesma forma nos
servidores em produção. Quem já lidou com isso sabe que mesmo uma aplicação web
simples pode enfrentar problemas com variáveis ambientais erradas, configurações
diferentes, plugins ou módulos faltando.

Para contornar isso, foi criado um encapsulamento de aplicações junto com o ambiente que
ela necessita, da jeito que o desenvolvedor pensou e testou o software. Este encapsulamento
pode ser copiado junto com a aplicação para o servidor de produção em forma de contêiner,
garantindo que o software irá executar da forma esperada em qualquer lugar.

Existem muitos pacotes de conteineres para Linux, sendo os mais populares o Docker,
Kubernetes e o LXC.

304 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Simulado
2.6 Automatizar e Agendar Trabalhos
no Linux

O Linux possui um robusto sistema de agenda que possibilita que tarefas administrativas
sejam programadas sem a direta intervenção humana.

Este sistema utiliza duas facilidades para automatizar as tarefas, o cron e o at. O primeiro é
apropriado para procedimentos que devem ser executadas com certa periodicidade. Já o at é
melhor para agendar tarefas simples para serem executadas no futuro, de forma não
recorrente.

Recentemente o serviço de timer do Systemd também pode ser usado para executar tarefas
de forma agendada ou recorrente.

cron

O cron é um serviço que provê o serviço de agendamento de tarefas para os usuários e o


sistema.

Ele permite que um comando, programa ou script seja agendado para um determinado dia,
mês, ano e hora. É muito usado em tarefas que precisam ser executadas a cada hora, dia ou
qualquer outro período de tempo, de forma recorrente.

Geralmente o cron é utilizado para executar arquivamento de logs e checagem da


integridade do sistema e outras manutenções periódicas.

As tarefas do sistema que serão executadas são definidas no arquivo /etc/crontab.

Cada usuário também pode ter suas tarefas, configuradas em arquivos individuais no
diretório /var/spool/cron/ com o login da conta do usuário.

O cron possui um utilitário chamado crontab que facilita a visualização e edição dos
arquivos do cron.

Para agendar uma nova tarefa, podemos utilizar o comando crontab ou editarmos o arquivo
/etc/crontab com qualquer editor de texto e definir quando a tarefa será executada.

O formato que o arquivo de cron usa é:

MINUTOS HORAS DIA MES SEMANA USUARIO COMANDO

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 305


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Figura 18 - Formato do Crontab

Não é necessário reiniciar o serviço do cron porque ele verifica seus arquivos a cada minuto.

O formato de um arquivo crontab é importante para o exame.

Os valores para cada campo podem ser:

Minuto: Valor entre 0 e 59;

Hora: Valor entre 0 e 23;

Dia do Mês: Valor entre 1 e 31;

Mês: Valor entre 1 e 12 (identificando os meses de janeiro a dezembro);

Dia da Semana: Valor entre 0 e 7, sendo que zero ou sete são usados para identificar o
domingo.

Login do Usuário: O usuário que será usado para executar o comando;

Comando: Programa que será executado, mais seus parâmetros normais.

Cada campo deve ser separado por um ou mais espaços ou tabulações.

O símbolo asterisco “*” pode ser usado para indicar que qualquer data ou hora são válidas.
Também é possível especificar intervalos de tempo usando a barra "/". Exemplo "*/5" no
campu minutos indica que o comando deve rodar a cada 5 minutos.

É possível especificar intervalos para que o comando seja executado através do hífen “-”,
indicando os períodos de execução incluindo o número inicial e final.

Uma lista de horas e datas pode ser feita utilizando a vírgula “,” para separar os valores.

Veja alguns exemplos de cron:

306 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Executa o comando sync todo o dia as 10:00:

0 10 * * * root sync

Executa o comando updatedb toda segunda-feira às 06:00:

0 6 * * 1 root updatedb

Executa o comando runq todos os dias a cada vinte minutos:

0,20,40 * * * * root runq

Envia um e-mail as 0:15 todos os natais para a carla:

15 0 25 12 * root mail carla < natal.txt

Executa o comando poff às 5:30 de segunda à sábado:

30 5 * * 1-6 root poff

Executa um script PHP a cada 5 minutos:

*/5 * * * * root /usr/bin/php -c /etc/php.ini


/home/script.php

crontab
O comando crontab comando facilita a edição dos arquivos de configuração do cron. Ele é útil
para edição dos arquivos dos usuários localizados em /var/spool/cron/

O crontab salva o arquivo individual do cron com o nome do login do usuário.

Este arquivo tem o mesmo formato do /etc/crontab exceto por não possuir o campo usuário
(UID), uma vez que nome do arquivo já tem esta identificação.

# ls –l /var/spool/cron/tabs
-rw——— 1 root root 264 Jun 20
14:36 root
-rw——— 1 root users 199 Jun 20
15:58 uira
As opções mais frequentes do crontabsão:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 307


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

-e: Edita o arquivo de cron utilizando o editor vi.


-l: Lista o conteúdo do arquivo de cron do usuário corrente
-r: Remove o arquivo de cron.
-u usuário: Realiza uma das operações como se fosse um determinado usuário. Deve
ser usada em conjunto com as outras opções e somente o root pode alterar o cron de
outros usuários.

Veja os exemplos:

Neste exemplo o comando “/usr/bin/mrtg /etc/mrtg.cfg” é executado a cada 5 minutos e o


“/bin/sendip.sh” todos os dias à 01:00am:

$ crontab –l
*/5 * * * * /usr/bin/mrtg /etc/mrtg.cfg
0 1 * * * /bin/sendip.sh

Para agendar alguma tarefa no cron, utilize o "crontab –e" para editar o arquivo com o vi:

$ crontab -e

Inclua uma linha em branco no final do arquivo, caso contrário o último comando não será
executado.

Permissões do Cron
O cron possui dois arquivos que habilitam ou desabilitam o seu uso pelos usuários.
Dependendo da distribuição, eles podem ter nomes e lugares diferentes. São eles:

/etc/cron.allow

Se o arquivo cron.allow existir, um determinado usuário precisa ter seu login listado no seu
conteúdo para ter permissões expressas para o uso do cron.

/etc/cron.deny

Se o arquivo cron.deny existir, os logins listados em seu conteúdo são proibidos de utilizar o
cron. Os demais usuários poderão usar o cron.

Se nenhum dos dois arquivos existirem, o uso do cron será permitido para todos os usuários.
Se o arquivo cron.deny estiver vazio, todos os usuários terão permissão de usar o cron.

Diretórios Especiais do Cron


/etc/cron.d

O cron também conta com um diretório especial em /etc/cron.d. Este diretório pode conter os
arquivos:

308 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

daily: especifica quais comandos são executados diariamente;


hourly: especifica quais comandos são executados de hora em hora;
weekly: especifica quais comandos são executados toda semana;
monthly: especifica quais comandos são executados todos os meses.

Os arquivos contidos neste diretório deve seguir o formado do /etc/crontab:

# cat /etc/cron.d/sysstat
*/10 * * * * root /usr/lib64/sa/sa1 1 1
53 23 * * * root /usr/lib64/sa/sa2 -A

Todos os scripts ou comandos executados são sob a permissão do usuário root.

Os arquivos em /etc/cron.d costumam ter seu nome precedido de um número inteiro maior
que zero para ordenar a sua execução

/etc/cron.{daily, hourly, weekly, monthly}

Outras possibilidades que o cron examina são os diretórios /etc/cron.daily,


/etc/cron.hourly, /etc/cron.weekly e /etc/cron.monthly.

Estes diretórios podem conter scripts que serão executados nos intervalos de tempo que
cada nome de arquivo especifica.

# ls -l /etc/cron.daily/
-rwx------. 1 root root 219 Apr 10 2018 logrotate
-rwxr-xr-x. 1 root root 618 Mar 17 2014 man-db.cron
-rwx------. 1 root root 208 Apr 10 2018 mlocate

Nestes diretórios os arquivos devem conter scripts com comandos que serão executados, e
não um agendamento do que será executado como no crontab.

Veja o exemplo do script logrotate:

$ cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf
exit 0

Outro detalhe importante: os scripts em /etc/cron.{daily, hourly, weekly, monthly}


precisam estar com a permissão executável "X" habilitada.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 309


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

at
$ at

O comando at agenda tarefas de forma semelhante ao cron.

Sua principal aplicação é para disparar tarefas que devam ser executadas somente uma vez.

O seu formato para agendar as tarefas são mais amigável e mais próximo da notação
humana.

Uma característica deste programa é que ele executa as tarefas mesmo que tenham passado
do seu horário de execução. É útil em computadores que são desligados com frequência ou
quando ocorre uma interrupção no fornecimento de energia.

As notações de data e hora possíveis podem ser informadas nos formatos:

HH:MM: HH para hora e MM para minuto;


midnight: para meia-noite;
noon: para meio-dia;
teatime: para 16:00;
MMDDYY: MM para mês, DD para dia e YY para ano;
MM/DD/YY;
DD.MM.YY;
+ num unidade: Onde num é o número de unidades de tempo. As unidades podem
ser minutes (minutos), days (dias), hours (horas) e weeks (semanas).

As opções mais frequentes são:

-l: Lista todas as tarefas agendadas pelo at;


-d N: Apaga uma determinada tarefa identificada pelo número N;
-f arquivo: Indica o arquivo que contém os comandos a serem executados.

Veja os exemplos:

Executa os comandos especificados no arquivo comandos.txt no horário do café da tarde às


16:00 horas.

# at -f comandos.txt teatime

Executa os comandos especificados no arquivo comandos.txt em 3 minutos.

# at -f comandos.txt +3 minutes

310 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Executa os comandos especificados no arquivo comandos.txt daqui a 3 horas no dia de


amanhã.

# at -f comandos.txt tomorrow +3 hours

Outra forma de utilizar o at, é digitar diretamente os comandos que serão executados no seu
prompt de comandos:

# at now + 2 minutes
at> w
at> Ctrl D
job 1 at Fri Oct 18 14:25:00 2019

Neste exemplo, o at irá abrir um prompt de comandos "at>" para digitar os comandos um
por linha. O comando "w" que mostra os usuários conectados será executado dentro de 2
minutos pelo at.

Para sair do prompt do at, deve-se digitar Control-D.

O job recém criado pode ser visto com o comando "atq":

# atq
1 Fri Oct 18 14:25:00 2019 a root

O resultado dos comandos executados pelo at são enviados por e-mail para o usuário que
agendou a tarefa:

From root@certificacaolinux.com.br Fri Oct 18 14:33:00 2019


Subject: Output from your job 2
To: uira@certificacaolinux.com.br
Date: Fri, 18 Oct 2019 14:33:00 +0000 (UTC)

14:33:00 up 3 days, 11:49, 1 user, load average: 0.04, 0.13, 0.11


USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
uira pts/0 ip-10-8-0-6 14:14 9.00s 0.08s 0.01s sshd: uira[priv]

atq
O comando atq lista os jobs pendentes do usuário, e no caso do root, lista todos os jobs. O
comando fornece na saída o número do job, data, hora, fila e usuário.

Exemplo:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 311


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

$ atq
4 2015-05-11 19:00 uribeiro

atrm
O comando atrm remove um job da fila de tarefas, identificado pelo número do job.

Exemplo:

$ atrm 4

Todas as tarefas agendadas são armazenadas em arquivos dentro do diretório


/var/spool/at/.

Permissões do at
O comando at também possui dois arquivos responsáveis pela segurança de acesso ao
agendador:

/etc/at.allow
/etc/at.deny

Se o arquivo at.allow existir, um determinado usuário precisa ter seu login listado no seu
conteúdo para ter permissões expressas para o uso do at.

Se at.deny existir, os logins listados em seu conteúdo são proibidos de utilizar o at, e todos
os outros usuários estão liberados.

Se nenhum dos dois arquivos existirem, o uso do at será permitido somente para
superusuário.

Se o arquivo at.deny estiver vazio, o uso do at será permitido por todos os usuários.

Multitarefa: Processos em Primeiro e


Segundo Planos

Saber lidar com os programas em execução, mudar a prioridade de execução e terminar os


processos são habilidades requeridas para o exame.

É bem verdade que o Kernel do Linux tem uma capacidade excelente para trabalhar com
processos sem intervenção do usuário. Mas às vezes é preciso que o root intervenha e
termine um processo que esteja comportando de forma egoísta e exaurindo os recursos da
máquina.

Este controle de processos é especialmente importante porque o Linux é um sistema


multitarefa, multiusuário e multiprocessado. O conceito de multitarefa significa que o Linux é
312 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

capaz de executar diversos programas e serviços ao mesmo tempo de forma preemptiva.

Se tivermos apenas um processador central no computador com Linux, o sistema fará o


escalonamento (rodízio) dos processos de forma tão eficiente que o usuário terá a impressão
de que ele pode executar mais de um programa ao mesmo tempo.

E o Linux ainda possui a capacidade de gerenciar os processos de forma eficaz com o


multiprocessamento real quando temos mais de um processador central envolvido.

A "conversa" entre o sistema operacional e os programas em execução é através de sinais,


que são interrupções de software, utilizadas para coloca um programa conectado a um
terminal, em espera, em segundo ou em primeiro plano, e até mesmo parar sua execução.

Sinais

Cada processo no Linux fica à escuta de sinais. Estes sinais são utilizados pelo Kernel, por
outros processos ou por usuário para avisar a um determinado processo sobre algum evento
em particular. O guru de UNIX W. Richard Stevens descreve os sinais como interrupções de
software.

Quando um sinal é enviado para um processo ele toma uma determinada ação dependendo
do valor que este sinal carrega.

Cada sinal tem um nome exclusivo e um valor numérico.

Vejamos alguns valores e suas ações:

TABELA – Sinais mais importantes

Sinal Valor Ação


Numérico

SIGHUP 1 Hang-Up ou desligamento. Este sinal é utilizado automaticamente quando você


desconecta de uma sessão ou fecha um terminal. Ele também é utilizado por
processos servidores para invocar a releitura do arquivo de configuração.

SIGINT 2 É o sinal de interromper o funcionamento. Ele é acionado por exemplo quando se


aperta as teclas Ctrl C.

SIGKILL 9 Terminar o processo incondicionalmente de forma rápida e drástica. Este tipo de


sinal pode deixar arquivos abertos e bases de dados corrompidas. Deve ser
utilizado caso o processo pare de responder ou em uma emergência.

SIGTERM 15 Termina o processo de forma elegante, possiblitando que ele feche arquivos e
execute suas rotinas de fim de execução.

SIGCONT 18 É um sinal para um processo que foi parado com o sinal SIGSTOP para que ele
continue a executar.

SIGSTOP 19 É um sinal que pode ser enviado para um processo parar de funcionar
momentaneamente. Ele continua existindo, mas não recebe mais CPU para
executar, até que receba o sinal SIGCONT.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 313


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Sinal Valor Ação


Numérico

SIGTSTP 20 Termina a execução para continuar depois. Este sinal é enviado automaticamente
quando utilizamos as teclas ctrl-z. É utilizado para colocar o processo em segundo
plano.

O Linux possui mais de 30 sinais definidos. A maioria é utilizada pelo Kernel e alguns pelos
usuários em situações específicas.

O entendimento de sinais é importante para sabermos como o sistema interage com os


processos em execução. Os comandos kill e killall podem ser usados para enviar sinais
específicos para um processo em execução.

A maioria dos administradores ao parar um processo, usa o SIGKILL. No entando, este sinal é
muito "forte", pois faz uma parada abrupta no processo em execução, e pode deixar arquivos
abertos, indexes mal feitos, e dados corrompidos. É melhor usar o sinal SIGTERM, que
permite que o programa termine elegantemente, fechando os arquivos, indexes e bases de
dados.

O Linux permite que os usuários enviem sinais para os programas em execução através do
comando kill.

kill
$ kill [-sinal | -s sinal] PID

O comando kill envia sinais para os processos.

Ele é usado geralmente para terminar a execução de processos identificados pelo seu PID.

Se nenhum sinal específico for passado como parâmetro, o kill irá enviar o sinal SIGTERM
(15) para terminar o processo de forma elegante.

Neste exemplo o killForça o servidor de web identificado pelo PID 1953 a ler novamente o
seu arquivo de configuração:

$ ps aux | grep httpd


wwwrun 1952 0.0 1.7 93232 2248 ? S 16:15 0:00
/usr/sbin/httpd -f /etc/httpd/httpd.conf
wwwrun 1953 0.0 1.7 93232 2248 ? S 16:15
0:00 /usr/sbin/httpd -f /etc/httpd/httpd.conf
wwwrun 1954 0.0 1.7 93232 2248 ? S 16:15
0:00 /usr/sbin/httpd -f /etc/httpd/httpd.conf

# kill –HUP 1953


Termina abruptamente os processos de serviço de web com os PIDs 1953 e 1954:
314 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

# kill –9 1953 1954

A opção -l do kill oferece uma lista de sinais e seus respectivos códigos:

$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
( ... )

Multitarefa: processos em segundo


plano e processos em primeiro plano

Como sistema operacional multitarefa, o Linux suporta a execução de muitos processos - que
nada mais são do que programas em execução. Estes programas podem ser executados
conectados ao terminal ou não. Se estão conectados ao terminal, dizemos que ele está em
primeiro plano. E se não precisam estar conectados ao terminal para funcionar, dizemos que
ele está em execução em segundo plano.

Processos em primeiro plano (Foreground)


Um processo em primeiro plano é qualquer programa que quando executado, ele está
diretamente conectado ao terminal. Alguns processos em primeiro plano permitem algum
tipo de interface que oferece suporte à interação contínua do usuário, enquanto outros
executam uma tarefa e "congelam" o terminal enquanto a tarefa é concluída.

O próprio bash é um processo que está em execução no primeiro plano, esperando por uma
interação do usuário ao aguardar e executar comandos.

Quando você executa um comando no bash, um processo filho é criado, e o terminal fica a
cargo do processo filho, que detém o terminal até que termine de executar.

No exemplo, quando você digita ls no bash, o comando ls é executado em primeiro plano, e


fornece uma lista de arquivos. Ele não devolve o terminal ao bash até que termine de listar
os arquivos:

$ ls

Se existirem muitos arquivos no diretório, o ls pode demorar a devolver o prompt de


comandos para o usuário.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 315


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Processos em segundo plano (Background)


Um processo em segundo plano é qualquer programa que quando executado, ele não está
conectado ao terminal. Ele simplesmente executa, sem nenhuma interação direta com
usuário. Este tipo de programa geralmente são damons (serviços) que o sistema provê, tais
como um servidor web, servidor de email, etc.

&
Virtualmente qualquer programa que possa ser executado sem exigir a interação do usuário
pode ser executado em segundo plano. Para isso, basta adicionar o sinal de "&" no final do
comando.

A saída do comando em segundo plano ainda pode ser descarregada no terminal, mesmo
que esse comando esteja executando em segundo plano.

No exemplo, o ls pode ser executando em segundo plano, mas sua saída ainda vai para o
terminal:

$ ls -l &
[1] 14907
[ec2-user@ip-172-30-0-241 etc]$ total 1444
drwxr-xr-x 4 root root 35 jun 21 18:54 acpi
-rw-r--r-- 1 root root 16 mar 8 2019 adjtime
-rw-r--r-- 1 root root 1518 jun 7 2013 aliases
-rw-r--r-- 1 root root 12288 abr 5 13:44 aliases.db
drwxr-xr-x 2 root root 261 abr 18 20:16 alternatives
drwxr-xr-x 3 root root 17 mar 8 2019 amazon
drwxr-xr-x 2 root root 50 abr 10 11:06 amplify-agen
( ... )

Geralmente os programas que executam em segundo plano são preparados para isso, de
modo que não enviam nada para saída padrão (STDOUT). Mas você pode mandar a saída
padrão de um comando que não foi preparado para isso com o condutor:

$ ls -l > /tmp/saida &

Controle de Processos
Cada programa que é colocado em execução no shell é tratado como um Job (trabalho), que
nada mais é do que um Processo que o shell gerencia.

Cada Job recebe uma ID sequencial. Como um job é um processo, cada job também tem um
ID de pocesso (PID) associado. Existem três tipos de status de jobs:

1. Primeiro plano (foreground): Quando você insere um comando em uma janela do


terminal, o comando ocupa a janela do terminal até que seja concluída. Este é um job
em primeiro plano.
316 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

2. Segundo plano (background): quando você insere o símbolo & no final de uma linha
de comando, o comando é executado sem ocupar a janela do terminal. O prompt do
shell é exibido imediatamente depois que você pressiona Enter. Este é um exemplo de
um trabalho em segundo plano.
3. Parado (stoped): se você pressionar Control + Z para um job em primeiro plano ou
inserir o comando stop para um job em segundo plano, o job será interrompido. Este
job é chamado de job interrompido.

Existem alguns comandos que permitem gerenciar os Jobs no Linux, tais como bg, fg e jobs.

bg
$ bg [número da tarefa]

Depois que um processo entrou em execução em primeiro plano, isto é, conectado a um


terminal, ele pode ser colocado em segundo plano.

Para fazer isso é necessário interromper temporariamente sua execução com o sinal
SIGTSTP (20) pressionando as teclas Ctrl-z e acionando logo depois do comando bg.

O comando bg coloca em segundo plano um processo em execução que foi "congelado" pelo
sinal SIGTSTP. Veja no exemplo:

$ find / -name mss > lista_msg.txt


CTRL-z
[1]+ Stopped find / -name mss >lista_msg.txt

$ bg
[1]+ find / -name mss >lista_msg.txt &

Neste exemplo o utilitário find é executado normalmente. Durante a sua execução é enviado
o sinal TSTP (ctrl-z) e depois ele é colocado em segundo plano com o comando bg e ganha o
número de tarefa 1 pelo controle de tarefas.

Cada processo que for colocado em execução com o "&" também ganha um número de Job
pelo controle de tarefas.

O bg também aceita que número do job - seja passado como parâmetro.

fg
$ fg [número da tarefa]

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 317


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

O comando fg faz exatamente o oposto do comando bg, colocando a tarefa ou processo em


segundo plano em primeiro plano e ligada a um terminal.

Ele também aceita que um número de job seja passado como parâmetro.

Neste exemplo novamente o comando find é colocado em segundo plano com o Ctrl-Z e ele
ganha o número de Job1:

$ find / -iname a* 2>/dev/null


^Z
[1]+ Parado find / -iname a* 2> /dev/null

Pode-se verificar os Jobs e seu status com o comando jobs:

$ jobs
[1]+ Parado find / -iname a* 2> /dev/null

Para devolver o Job para primeiro plano e conectado ao terminal, basta executar o fg. Neste
exemplo, foi passado como parâmetro o número do Job:

$ fg 1
find / -iname a* 2> /dev/null

jobs
$ jobs [opções] [número_da_tarefa]

O comando jobs lista os processos que estão em execução em segundo plano. Se um número
da tarefa é fornecido o comando retornará as informações pertinentes somente à tarefa em
questão.

O número da tarefa é fornecido quando o processo é colocado em segundo plano.

As opções mais frequentes são:

-l Lista o PID dos processos em segundo plano.


-r Lista somente os Jobs em execução
-s Lista somente os Jobs parados

Neste exemplo, o find está parado. Como usamos a opção -l, o jobs informa também o PID
27159 do programa find:

$ jobs -l
318 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

[1]+ 27159 Stopped find / -iname ?a* 2> /dev/null

O número do job pode ser usado como parâmetro nos comandos bg e fg, principalmente se
houver mais de um job na gerência de tarefas.

nohup
$ nohup [comando]

Independentemente se os programas em execução no shell estão e primeiro ou segundo


plano, eles serão terminados quando o usuário se desconectar ou fechar o terminal.

Isto acontece porque os Jobs recebem o sinal SIGHUP (desconexão), que é um aviso do
terminal a seus processos filhos de que ocorreu uma desconexão.

Para que isso não aconteça, o comando nohup torna o processo imune ao sinal SIGHUP,
permitindo que ele continue em execução mesmo se o terminal fechar ou a conexão cair.

Desta forma, o utilitário nohup executa o comando especificado sem atrelá-lo a nenhum
terminal, de forma imune a quedas de conexão e desconexões.

Neste exemplo o nohup irá executar o comando find / -name uira* e mandar a saída para
arquivos_encontrados, e ainda será executado em segundo plano:

$ nohup find / -name uira* > arquivos_encontrados &

O nohup executa o comando especificado, mas não permite que ele receba nenhuma entrada
de dados pelo terminal.

Todas as saídas (STDOUT), incluindo mensagens de erro (STDERR), serão gravadas no


arquivo nohup.out no diretório de trabalho ou no diretório local.

Você pode usar o nohup em primeiro ou em segundo plano. O mais comum é executá-lo em
segundo plano colocando o "&" no final da linha de comandos.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 319


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Simulado
2.7 Operação de dispositivos Linux

Um computador tem muitos dispositivos de hardware ligados a ele. Desde monitores, discos
rígidos, memória RAM, teclado, placas de áudio, placas de vídeo, placas de rede, wifi, USB,
bluetooth, cameras web, mouses, dispositivos biométricos, telas touchscreen, impressoras,
etc.

Essa infinidade de hardware precisa ser devidamente reconhecida pelo sistema operacional
para que tudo funcione a contento. Graças aos constantes esforços dos desenvolvedores do
Kernel e fabricantes de hardware, o suporte aos diversos dispositivos no Linux tem sido cada
vez melhor e ultimamente detectados de forma transparente para o usuário.

Mesmo assim, parte do trabalho do administrador do Linux é certificar-se de que todos esses
dispositivos funcionem corretamente. Este capítulo descreve como instalar e solucionar
problemas dos diferentes tipos de dispositivos de hardware que podem ser conectados ao
seu sistema Linux.

A implementação de reconhecimento de hardware no Linux é feita por subsistemas, que são


responsáveis por identificar o tipo de hardware conectado (SYSFS, HELD e D-BUS) e então
designar um descritor de arquivos (UDEV) para que o hardware possa ser endereçado e
utilizado como facilidade pelo sistema e pelos programas como se fosse um arquivo no
sistema.

SYSFS

O sysfs é um recurso do Kernel para exportar informações úteis sobre o sistema para os
processos (programas) dos usuários através de um sistema de arquivo em memória.

O sysfs organiza as informações do Kernel em diretórios de forma rigorosa e baseada na


organização interna das estruturas de dados do Kernel.

Os arquivos que são criados neste sistema de arquivos são principalmente em ASCII (texto
puro) com um valor por arquivo. Estas características asseguram que as informações
passadas pelo sysfs aos programas sejam precisas e utilizadas facilmente.

Uma vez que a estrutura do sysfs é composta de diretórios, arquivos e links simbólicos, a
navegação dentro dele é fácil e intuitiva. O sysfs geralmente é montado no diretório /sys.

Os principais diretórios do sysfs são: block, bus, class, devices, firmware, fs, kernel, module e
power.

320 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

BLOCK

O diretório block contém subdiretórios para cada sistema de arquivos de bloco (discos
rígidos, principalmente) existentes no sistema. Dentro dos diretórios dos dispositivos, há
diversos arquivos que indicam, ente outras coisas, o tamanho do dispositivo, status etc.

BUS

Este diretório contém subdiretórios para cada tipo de barramento suportado pelo Kernel. E
cada subdiretório contém os diretórios devices e drivers. O primeiro contém uma lista de
todos os dispositivos encontrados que são do tipo de barramento indicado. O segundo
contém os drivers de dispositivos daquele tipo de barramento.

CLASS

O diretório class contém representações de cada classe de dispositivo que está registrado no
Kernel. As classes indicam o tipo de dispositivo que elas representam. Por exemplo: classe de
impressoras, classe de discos etc . Cada subdiretório de classe terá um diretório para cada
tipo de dispositivo encontrado pertencente àquela classe. Por exemplo: a classe “net”
contém os dispositivos “eth0” e “eth1”. E, dentro de cada diretórios de dispositivo, são
encontrados arquivos e diretórios associados ao tipo de dispositivo a que ele pertence.

DEVICES

O diretório devices contém a hierarquia global dos dispositivos encontrados e suportados


pelo Kernel. Sua hierarquia de diretórios obedece a organização dos dispositivos em qual tipo
de conexão elétrica eles estão conectados. Apenas dois dispositivos são a exceção da regra:
dispositivos de plataforma (platform) e de sistema (system). O primeiro diretório é relativo
aos dispositivos periféricos inerentes à plataforma de processamento e barramento do
hardware. Por exemplo: dispositivos inerentes a portas de entrada e saída, controladores
seriais e paralelos, etc. Já o system representa os dispositivos não periféricos que não se
encaixam em qualquer outra classificação. Por exemplo: CPUs, APICs, temporizadores etc.

FIRMWARE

O diretório firmware contém interfaces para verificar e atribuir objetos específicos de


firmware. Firmware são códigos executados durante o processo de carga da máquina, como
software da BIOS.

FS
O diretório fs contém subdiretórios dos sistemas de arquivos presentes. Ele contém abstrações
das características e recursos presentes nos sistemas de arquivos.

MODULE

O diretório module contém subdiretórios com todos os módulos de Kernel carregados para a

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 321


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

memória. Os módulos são pedaços de programas que podem ou não fazer parte do Kernel,
de forma que são lidos e executados de acordo com a necessidade do usuário. Por exemplo:
se você não utiliza com frequência o drive para um HD externo USB, pode optar por carregar
o módulo que habilita suporte a discos externos somente quando for fazer uso deste tipo de
mídia. Este tipo de arquitetura modular permite que o Kernel fique mais leve, ocupando
menos memória e também menos processamento, deixando a CPU mais tempo livre para
executar os programas dos usuários. Um Kernel enxuto permite que o sistema tenha uma
eficiência melhor, mas não impede que outras funcionalidades sejam agregadas sob
demanda na forma de módulos do Kernel. É importante saber que todos os diretórios de
módulo contêm um arquivo chamado refcnt que conta o número de referências ou número
de usuários que fazem uso do módulo específico.

POWER

O diretório power representa o subsistema de gerenciamento de energia. Possui alguns


arquivos que representam o método que o sistema irá utilizar para entrar em modo de
suspensão ou economia de energia.

É importante você saber que as informações contidas neste sistema de arquivos são
organizadas de forma que diversos programas e utilitários fazem uso delas para interagir
melhor com o Kernel.

HALD

O hald é um programa que fica em execução em modo de servidor (daemon) que mantém
um banco de dados sobre os dispositivos conectados ao sistema, em tempo real. Este
programa fica conectado no Kernel através do D-BUS escutando as mensagens referentes
aos dispositivos e provê uma biblioteca de programação API para que outros programas
possam descobrir, monitorar e fazer uso dos dispositivos. O HALD facilita o trabalho dos
programadores oferecendo um meio fácil e rápido de interagir com os dispositivos sem
precisar fazer acesso direto a eles.

UDEV

O gerenciamento dinâmico de dispositivos (udev) é responsável por manter a estrutura de


diretório do /dev (diretório que contém os links que representam os dispositivos) de forma a
permitir que somente dispositivos conectados sejam listados na estrutura do /dev.

Geralmente este gerenciador é executado na forma do programa chamado udevd em modo


de servidor (daemon) que fica escutando os eventos do Kernel para encontrar quando um
dispositivo é removido ou adicionado ao sistema. Quando se percebe um evento de
dispositivo no Kernel ele compara com as regras relacionadas no sysfs para identificar o
dispositivo e, depois disso, cria ou remove o link simbólico do dispositivo no diretório /dev.

No diretório /dev encontramos geralmente dois tipos de descritores de arquivos: de bloco e

322 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

de caracteres.

Os dispositivos de bloco tem o tipo de arquivo indicado com a letra "b" e representam
dispositivos de armazenamento de dados, como discos rígidos, SSDs, CD-ROMs, DVDs, etc.

Já os dispositivos de caractere tem seu tipo indicado com a letra "c" e representam os
dispositivos de entrada e saída de dados lentas, como mouses, teclados, monitores e
terminais.

$ ls -la /dev/sd* /dev/tt*


brw-rw---- 1 root disk 8, 0 Dec 18 22:16 /dev/sda
brw-rw---- 1 root disk 8, 1 Dec 18 22:16 /dev/sda1
crw-rw-rw- 1 root tty 5, 0 Dec 26 18:29 /dev/tty
crw--w---- 1 root tty 4, 0 Dec 18 22:16 /dev/tty0

Mapper

O sistema UDEV também mantém um mapeamento especial no diretório /dev/mapper.

É neste diretório que o sistema mapeia dispositivos de blocos físicos para dispositivos de
bloco virtuais. Os dispositivos de blocos virtuais permitem que o sistema intercepte os dados
gravados ou lidos do dispositivo físico e execute algum tipo de operação neles.

É através deste mapeamento e interceptação de dados que o LVM (Logical Volume Manager)
utiliza para criar unidades lógicas e também o LUKS (Linux Unified Key Setup) utiliza para
para criptografar dados em discos rígidos.

Hotplug x Coldplug

Existem dispositivos que podem ser conectados ou removidos com o computador ligado e em
pleno funcionamento, que são categorizados como hotplug. Para estes o Kernel será capaz
de perceber sua presença ou ausência e carregar os drivers, scripts e programas necessários
ao seu correto funcionamento. Nesta categoria se enquadram: teclado, mouse, webcam, hd
externo USB, cd-rom externo USB, impressoras, caixas de som, microfones, monitores,
celulares, pendrives etc.

Já os dispositivos que obrigatoriamente devem ser conectados e removidos com o


computador desligado são chamados de coldplug. Qualquer tentativa de alterar seu estado
poderá causar travamento ou mesmo queima do equipamento. São eles: CPU, Memória RAM,
discos rígidos internos, placas internas (som, vídeo etc).

Para os dispositivos que podem ser plugados e desplugados a quente (sem desligar o
computador), o UDEV é responsável por ler as mensagens dos eventos do Kernel que
informam a conexão ou desconexão do hardware.

O UDEV então compara as mensagens recebidas pelo Kernel com regras definidas em
arquivos de configuração no diretório /dev/udev/rules.d. Este diretório serve para

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 323


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

configurar as regras customizadas do UDEV pelo administrador.

O diretório /lib/udev/rules.d também é lido pelo sistema UDEV, que mantém os arquivos de
configuração de regras do sistema. É possível também encontrar em algumas distribuições o
diretório /run/udev/rules.d que contém as regras em tempo de execução.

$ ls -1 /etc/udev/rules.d/
51-ec2-hvm-devices.rules
52-ec2-vcpu.rules
53-ec2-network-interfaces.rules
60-cdrom_id.rules
70-ec2-nvme-devices.rules
75-persistent-net-generator.rules

Se alguma mensagem do kernel bate com alguma regra definida nestes diretórios
(/etc/udev/rules.d, /lib/udev/rules.d e /run/udev/rules.d), o UDEV irá executar as regras para
aquela determinada mensagem.

Estas regras podem determinar por exemplo qual o nome no diretório /dev/ um disco rígido
USB ou um disco virtual terá ao ser conectado ao sistema, ou mesmo se um pendrive
conectado será automaticamente montado no diretório /media.

udevadm

O comando udevadm pode ser utilizado para interagir com o sistema UDEV, modificando seu
estado, consultando informações, monitorando as mensagens do Kernel ou até mesmo
simulando eventos do udev.

Exemplo:

Para ver informações de um disco:

$ udevadm info --query=property --name /dev/xvda


DEVLINKS=/dev/sda
DEVNAME=/dev/xvda
DEVPATH=/devices/vbd-51712/block/xvda
DEVTYPE=disk
ID_PART_TABLE_TYPE=gpt
ID_PART_TABLE_UUID=5a72544b-a4e2-4bbe-aed0-04f727374581
MAJOR=202
MINOR=0
SUBSYSTEM=block

O comando udevadm aceita os seguintes comandos:

udevadm info options - consulta a base de dados do UDEV;

324 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

udevadm trigger [options] - Busca eventos do Kernel;


udevadm settle [options] - Observa a fila de eventos do UDEV;
udevadm control command - Modifica o estado interno do UDEV;
udevadm monitor [options] - Monitora os eventos do Kernel;
udevadm test [options] devpath - Simula um evento do UDEV;

Informações de Hardware no diretório


/proc

O diretório /proc reúne informações do Kernel e dos processos. Ele é um pseudo-filesystem e


não existe realmente no disco. Neste diretório ficam as abstrações de descritores de tudo
quanto há no Kernel do sistema.

É possível não só ler os dados, bem como fazer alterações no comportamento do Kernel
alterando o conteúdo de arquivos em /proc. Neste diretório pode-se encontrar informações
importantes sobre o hardware conectado.

Os seguintes arquivos fornecem informações sobre o Hardware:

Arquivo Descrição Comando que


consulta este
arquivo

/proc/cpuinfo Fornece informações sobre a CPU -

/proc/devices Fornece informações sobre os dispositivos conectados lspci

/proc/dma Fornece informações o acesso direto a memória lsdev

/proc/interrupts Fornece informações sobre os IRQs lsdev

/proc/iomem Fornece informações sobre a entrada e saída de memória lsdev

/proc/ioports Fornece informações sobre as portas de entrada e saída lsdev

/proc/meminfo Fornece informações sobre a memória RAM e virtual free

/proc/modules Fornece informações sobre os módulos carregados no Kernel lsmod

/proc/partitions Fornece informações sobre as partições de disco lsblk

Não é comum o usuário consultar diretamente os arquivos do diretório /proc, mas


preferencialmente utilizar uma ferramenta que trate a informação.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 325


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Configurações de Hardware

As portas de entrada e saída são endereços de memória reservados no microprocessador


para os dispositivos realizarem entrada e saída de informações. Estes endereços de memória
são utilizados para troca de dados entre o processador e os dispositivos de forma
simplificada. Os dispositivos podem usar mais de uma porta de entrada/saída ou uma faixa
de endereços. Por exemplo, uma placa de som padrão usa as portas 0x220, 0x330 e 0x388.
Cada dispositivo possui um endereço de porta único, que não pode ser compartilhado entre
outros dispositivos.

O Acesso Direto a Memória (DMA) é usado para permitir a transferência de dados entre
dispositivos e a memória sem a intervenção do processador. Este acesso é feito através de
canais (channels). A maioria dos computadores tem dois controladores de DMA. O primeiro
controla os canais 0, 1, 2, 3 e o segundo, os canais 4, 5, 6, 7, totalizando 8 canais.

As Requisições de Interrupção (IRQ) são chamadas que os dispositivos podem fazer para
requerer atenção especial do processador. A maioria dos computadores oferece apenas 16
interrupções de hardware. Pode parecer pouco para as modernas configurações com os mais
diferentes dispositivos. Felizmente os IRQs podem ser compartilhados.

O mecanismo de tratamento das interrupções faz com que a CPU esteja atenta aos eventos
externos à sequência de instruções que ela está executando, para quando for necessária
uma quebra do processamento normal para atender a uma outra solicitação.

Em grandes sistemas multiusuário, uma constante rajada de interrupções é direcionada ao


processador. Respostas rápidas a essas interrupções são essenciais para manter os recursos
do sistema bem utilizados, e para prover tempos de resposta aceitáveis pelos usuários.

É importante saber que estes recursos são limitados e precisam ser gerenciados para que
conflitos entre os dispositivos sejam evitados.

Desta forma, os sistemas operacionais reagem a eventos que representam as solicitações de


serviços. Por exemplo, se uma aplicação necessita da leitura de um arquivo, ela faz a
solicitação a uma função executada pelo sistema operacional. Este irá acessar o controlador
do periférico e requisitar a transferência dos dados para o endereço de memória informado
no pedido do serviço. O controlador do periférico ao terminar avisa o processador através de
uma requisição de interrupção que fará com que o sistema operacional execute uma rotina
para seu tratamento.

326 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Requisição de Interrupção (IRQ)

Os IRQs são chamadas que os dispositivos podem fazer para requerer atenção especial do
processador. A maioria dos computadores oferece apenas 16 interrupções de hardware para
os mais diversos dispositivos.

Pode parecer pouco para as modernas configurações com os mais diferentes dispositivos.

Felizmente os IRQs podem ser compartilhados.

As interrupções do sistema podem ser visualizadas no Kernel com o comando:

$ cat /proc/interrupts
CPU0
0: 62 IO-APIC 2-edge timer
1: 9 xen-pirq 1-ioapic-edge i8042
4: 1673 xen-pirq 4-ioapic-edge ttyS0
8: 2 xen-pirq 8-ioapic-edge rtc0
9: 0 xen-pirq 9-ioapic-level acpi
12: 86 xen-pirq 12-ioapic-edge i8042
14: 0 IO-APIC 14-edge ata_piix
15: 0 IO-APIC 15-edge ata_piix
48: 70094074 xen-percpu -virq timer0
49: 0 xen-percpu -ipi resched0
50: 0 xen-percpu -ipi callfunc0
51: 0 xen-percpu -virq debug0
52: 0 xen-percpu -ipi callfuncsingle0
53: 0 xen-percpu -ipi spinlock0
54: 386 xen-dyn -event xenbus
55: 26283280 xen-dyn -event eth0
56: 5137531 xen-dyn -event blkif
57: 687607 xen-dyn -event blkif

Portas de Entrada/Saída IO (Input /


Output)

As portas de entrada e saída são endereços de memória reservados no microprocessador


para os dispositivos realizarem entrada e saída de informações.

Estes endereços de memória são utilizados para troca de dados entre o processador e os
dispositivos de forma simplificada. Os dispositivos podem usar mais de uma porta de
entrada/saída ou uma faixa de endereços. Por exemplo, uma placa de som padrão usa as

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 327


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

portas 0x220, 0x330 e 0x388.

Cada dispositivo possui um endereço de porta única que não podem ser compartilhados
entre outros dispositivos.

Os endereços de E/S em uso no sistema podem ser visualizados com o comando:

$ cat /proc/ioports
0000-001f : dma1
0020-003f : pic1
0040-005f : timer
0060-006f : keyboard
0070-007f : rtc
(...)

Acesso Direto a Memória (DMA)

A DMA é usada para permitir a transferência de dados entre dispositivos e a memória sem a
intervenção do processador. Este acesso é feito através de canais (channels). A maioria dos
computadores tem dois controladores de DMA. O primeiro controla os canais 0, 1, 2, 3 e o
segundo os canais 4, 5, 6, 7, totalizando 8 canais.

Os canais de DMA em uso no sistema podem ser visualizados com o comando:

$ cat /proc/dma
4: cascade

É importante que você saiba que estes recursos são limitados e precisam ser gerenciados
para que conflitos entre os dispositivos sejam evitados.

Alguns dispositivos como portas seriais e paralelas já utilizam os recursos no padrão a seguir:

Nome do Dispositivo no Linux Nome do Dispositivo no Porta E/S DMA IRQ


Windows

ttyS0 COM1 0x3F8 - 4

ttyS1 COM2 0x2F8 - 3

ttyS2 COM3 0x3E8 - 4

ttyS3 COM4 0x2E8 - 3

lp0 LPT1 0x378 - 7

lp1 LPT1 0x278 - 5

328 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Nome do Dispositivo no Linux Nome do Dispositivo no Porta E/S DMA IRQ


Windows

/dev/sda1 C: 0x1F0 - 14

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 329


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Dispositivos de Armazenamento

O Linux suporta diversos tipos de armazenamento de dados em massa. Estes dispositivos


podem ser categorizados em óticos, magnéticos ou em memória.

Os discos óticos são os CD-ROMs (700Mb), DVDs (4,7-8,5 Gb) e Blu-Rays (2550Gb). Não são
rápidos como os HDs, mas têm grande durabilidade se acondicionados em locais apropriados
e não permitem gravar os dados diversas vezes.

Os discos magnéticos têm grande capacidade de armazenamento de dados, que pode chegar
a 8 Terabytes. Alguns modelos são híbridos, pois possuem discos magnéticos e grandes
memórias flash para armazenar os dados mais lidos ou até mesmo o sistema operacional.
São sensíveis a solavancos e quedas.

Ainda na categoria de dispositivos magnéticos, temos as fitas magnéticas, bastante


utilizadas para backup de dados. Permitem gravar dados de forma sequencial com baixo
custo. Seu uso é cada vez menor devido ao baixo preço dos discos, computação em cloud e
outras estratégias de cópia de segurança mais avançadas.

Os “discos” em memória são na realidade bancos de memória flash chamados de Solid State
Drive (SSD) – drive de estado sólido – encapsulados em uma caixa do tamanho de um HD e
não possuem partes móveis como os discos óticos e magnéticos. Seu tempo de acesso aos
dados é incrivelmente veloz se comparado aos discos magnéticos e óticos, são resistentes a
quedas e solavancos, consomem menos energia, dentre outros benefícios. No entanto a
capacidade de armazenamento não ultrapassa 1 Terabyte, e seu custo é elevado em
comparação com os discos magnéticos. Eram muito utilizados em Ultrabooks e em servidores
de alta-performance, mas como seu preço vem a cair drasticamente, o que possibilitou o seu
uso em computadores pessoais.

Há os discos SCSI de alto desempenho, geralmente utilizado em servidores, com RAID


implementado por hardware. Estes discos tem confiabilidade maior, e também garantem
altas taxas de transferência devido ao barramento utilizado.

O comando lsblk é útil para informar os dispositivos de armazenamento conectados e


montados:

$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 8G 0 disk
└─xvda1 202:1 0 8G 0 part /
xvdb 202:16 0 4G 0 disk
└─xvdb1 202:17 0 4G 0 part [SWAP]
xvdf 202:80 0 16G 0 disk
└─xvdf1 202:81 0 16G 0 part
xvdg 202:96 0 20G 0 disk /home

330 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Configurando Dispositivos PCI

Os dispositivos PCI são os mais fáceis de configurar no Linux, uma vez que a sua
configuração geralmente é resolvida automaticamente pela própria placa mãe do
computador e o firmware da BIOS ou EFI. O Linux possui um comando chamado lspci que faz
a leitura dos arquivos nos diretórios /proc e /sys e mostra as placas PCI conectadas.

Desta forma, o comando lspci é útil para identificar o fabricante e modelo dos dispositivos
PCI:

lspci
$ lspci [opções]

Durante o processo de carga do sistema, o Kernel detecta os dispositivos PCI conectados no


micro. A lista das placas de expansão encontradas poderá ser lida através do comando lspci.

O lspci é útil para mostrar todas as informações sobre os barramentos PCI do sistema e os
dispositivos conectados a eles.

Suas opções mais comuns são:

-v Mostra informações detalhadas sobre todos os dispositivos.


-vv Mostra ainda mais informações sobre os dispositivos.
-n Mostra os códigos dos fabricantes e dispositivos.
-x. Mostra os primeiros 64 bytes da configuração PCI em hexadecimal.
-xxx Mostra toda a configuração PCI em hexadecimal.

Exemplo de uso:

$ lspci
00:00.0 Host bridge: ALi Corporation M1541 (rev 04)
00:01.0 PCI bridge: ALi Corporation M1541 PCI to AGP Controller
(rev 04)
00:02.0 USB Controller: ALi Corporation USB 1.1 Controller (rev
03)
00:03.0 Bridge: ALi Corporation M7101 PMU
00:07.0 ISA bridge: ALi Corporation M1533 PCI to ISA Bridge
[Aladdin IV]
00:09.0 Ethernet controller: Realtek Semiconductor Co., Ltd.
RTL-8139/8139C/8139C+ (rev 10)
00:0b.0 SCSI storage controller: Adaptec AHA-2940/2940W /

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 331


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

AIC-7871
00:0f.0 IDE interface: ALi Corporation M5229 IDE (rev c1)
01:00.0 VGA compatible controller: NVidia / SGS Thomson (Joint
Venture) Riva128 (rev 10)

Os modelos que utilizam o barramento PCI na maioria das vezes dispensam a configuração
manual dos recursos despendidos.

Você pode consultar o endereçamento e a interrupção dos dispositivos, consultado o


conteúdo dos arquivos /proc/interrupts e /proc/ioports.

$ cat /proc/interrupts
CPU0
0: 288898893 XT-PIC timer
1: 230 XT-PIC keyboard
2: 0 XT-PIC cascade
5: 7085061 XT-PIC eth0
8: 2 XT-PIC rtc
9: 0 XT-PIC usb-ohci
10: 152038 XT-PIC aic7xxx
12: 411599 XT-PIC eth1
14: 2 XT-PIC ide0

Para consultar as portas de entrada e saída:

$ cat /proc/ioports
0000-001f : dma1
0020-003f : pic1
0040-005f : timer
0060-006f : keyboard
0070-007f : rtc
0080-008f : dma page reg
5c20-5c3f : ALi Corporation. [ALi] M7101 PMU
b800-b80f : ALi Corporation. [ALi] M5229 IDE
d000-d0ff : Adaptec AHA-2940/2940W / AIC-7871
d000-d0ff : aic7xxx
d400-d4ff : 8139too
d800-d8ff : Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+

Desta forma, para habilitar o hardware, deve-se carregar o módulo do kernel correspondente
ao dispositivo. Para carregar o módulo, deve-se utilizar o comando modprobe seguido do
nome do módulo:

332 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

# modprobe 8139too

Algumas placas não PCI necessitam que o endereçamento de E/S e IRQ sejam informados
como argumentos para o comando modprobe alocar os recursos corretamente:

# modprobe ne io=0x300 irq=10

lsdev
$ lsdev

O comando lsdev consulta os arquivos /proc/interrupts, /proc/ioports e /proc/dma e


mostra os conteúdos pertinentes a cada dispositivo de maneira tabulada.

Nem sempre este comando está disponível como padrão no Linux, e pode ser instalado
manualmente com o pacote procinfo.

Exemplo:

$ lsdev
Device DMA IRQ I/O Ports
------------------------------------------------
0000:00:03.0 0000-0000
0000:00:05.0 0000-0000
0000:00:0e.0 0000-0000
0000:00:1d.0 0000-0000
0000:00:1f.0 0000-0000
0000:00:1f.1 0000-0000

Configurando Dispositivos USB

USB é a sigla de Universal Serial Bus. Esta tecnologia criou um novo método de conectar
periféricos ao computador.

Instalar um periférico foi encarado como uma tarefa assustadora, digna apenas de técnicos
ou pessoas com mais experiência. Isso exigia mais do usuário, pois ele tinha que abrir o
computador para instalar uma placa adicional, configurar jumpers, IRQs, endereços de
memória e de E/S.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 333


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Com a implementação do padrão Plug and Play (PnP) para detecção automática de
periféricos e dispositivos pela BIOS, essa tarefa se tornou mais fácil. O objetivo do padrão
PnP foi tornar o usuário capaz de instalar um novo periférico e usá-lo imediatamente, sem
muita dificuldade.

Um grupo de empresas criou em 1995 um consórcio para desenvolver uma especificação de


hardware e promover a rápida adoção dessa nova tecnologia e o desenvolvimento de novos
dispositivos compatíveis e de alta qualidade. Nascia o USB (Universal Serial Bus), um
barramento com um único tipo de combinação porta/conector, usado para ligar facilmente ao
computador várias categorias de dispositivos como scanners, câmeras, teclados, caixas de
som, impressoras etc .

O barramento USB 1.0 e 1.1 permite até 127 dispositivos a uma velocidade de até 12 Mbps.
Já o USB 2.0 permite taxas de transferência até 480 Mbps. A versão 3.0 introduzida em 2010
suporta uma taxa máxima teórica de 4,8 Gbps, mas na média trabalha a 3,2 Gbps. Este
último padrão requer um conector diferente do padrão 1.x e 2.0 e necessariamente um
kernel com versão superior ao 2.6.31.

Os periféricos que serão abordados como exemplo são o teclado, o mouse, impressoras e a
WebCam3 USB da Creative Labs.

O primeiro passo é determinar qual xHCI (Host Controller Interface) sua placa-mãe possui e
carregar o módulo correspondente ao chip.

O comando para determinar qual o chip utilizado em sua placa-mãe é:

# lspci -vt
-[00]-+-00.0 VIA Technologies, Inc. VT82C693A/694x [Apollo
PRO133x]
+-01.0-[01]——00.0 ATI Technologies Inc Rage XL AGP 2X
+-07.0 VIA Technologies, Inc. VT82C686 [Apollo Super South]
+-07.1 VIA Technologies, Inc. VT82C586/B/686A/B PIPC Bus Master
IDE
+-07.2 VIA Technologies, Inc. USB
+-07.3 VIA Technologies,
Inc. USB
+-07.4 VIA Technologies

Caso sua placa-mãe possua um Chipset da INTEL ou da VIA, será necessário subir o módulo
usb-uhci. Se possuir um Chipset da OPTi, SiS, ALi, Compaq, Apple será necessário subir o
módulo usb-ohci.

Os comandos são:

# modprobe usb-uhci

Ou
334 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

# modprobe usb-ohci

Estes módulos fornecerão suporte aos dispositivos USB.

Agora vamos aos periféricos:

Teclado
Para configurar corretamente o seu teclado USB, precisamos carregar dois módulos
adicionais:

# modprobe hid

$ modprobe keydev

Mouse
O procedimento para instalarmos um dispositivo Mouse USB é parecido com a ativação do
teclado:

# modprobe hid

# modprobe mousedev

Impressora
No caso da impressora, será necessário carregar, após o módulo correto de seu Chipset, o
seguinte módulo:

# modprobe printer

Webcam
A WebCam USB da Creative Labs é baseada no Chip OV511. Devemos carregar, após o
módulo do Chipset, o módulo apropriado para a câmera:

# modprobe ov511

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 335


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Outros Dispositivos
O Linux tem suporte a diversos dispositivos USB através dos módulos do Kernel. Você poderá
consultar os Chipsets suportados no diretório /lib/modules/versão-do-
kernel/kernel/drivers/usb.

Ferramentas Para Configuração de Dispositivos


USB

Algumas distribuições possuem ferramentas interessantes para a configuração automática


de dispositivos USB, como o usbmgr e o hotplug.

O usbmgr é uma ferramenta utilizada para carregar e descarregar os módulos do Kernel para
os dispositivos USB quando estes são conectados ou desconectados ao micro e executar
automaticamente os scripts de configuração destes.

usbmgr
O usbmgr possui o arquivo /etc/usbmgr.conf que contém uma vasta lista de dispositivos e
fabricantes que são automaticamente reconhecidos e configurados. Você não precisa alterar
este arquivo.

A ferramenta hotplug foi introduzida a partir do Kernel 2.4 para reconhecer e configurar
automaticamente dispositivos USB, PCI Cardbus (PCMCIA), IEEE 1394 (Firewire) e docking
stations para laptops.

hotplug
O hotplug entra em cena com a função de detectar novos dispositivos. É ele o responsável
por carregar os módulos apropriados, ajustar permissões e executar tarefas diversas sempre
que um novo dispositivo é conectado.

A partir do Kernel 2.6 o hotplug tornou-se o componente padrão para detecção de hardware
USB, PCMCIA e Firewire. Ele faz parte dos serviços do sistema e pode ser carregado com o
comando:

# /etc/init.d/hotplug start

Os arquivos de configuração do hotplug estão concentrados dentro da pasta /etc/hotplug.


O hotplug trabalha com códigos de identificação dos dispositivos, carregando módulos ou
executando scripts com funções diversas.

Na maioria das distribuições o arquivo /etc/hotplug/usb.distmap contém as regras pré-


configuradas dos diversos dispositivos USB.

Você pode colocar regras adicionais usando o arquivo /etc/hotplug/usb.usermap


possibilitando a execução de scripts personalizados quando determinados dispositivos são
conectados, como tocar um som, abrir um determinado programa ou mesmo fazer backup
336 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

automático.

lsusb
$ lsusb [opções]

O lsusb é útil para mostrar todas as informações sobre os dispositivos USB conectados a este
tipo de barramento.

A opção –v mostra detalhadamente as informações sobre o dispositivo USB.

Exemplo de uso:

$ lsusb -v
Bus 001 Device 001: ID 0000:0000
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.00
bDeviceClass 9 Hub
bDeviceSubClass 0 Unused
bDeviceProtocol 0
bMaxPacketSize0 8
idVendor 0x0000
idProduct 0x0000
bcdDevice 0.00

Buffer de Mensagens do Kernel

É durante o processo de carga do Kernel que os dispositivos são detectados e o software


correspondente é carregado, incorporado ao Kernel ou através de módulos do sistema.

Quando ocorre algum problema durante a carga do sistema, é possível consultar as


mensagens que Kernel emitiu consultado o seu buffer de mensagens através do comando
dmesg.

Exemplo:

$ dmesg |grep vga


[ 0.109981] pci 0000:01:00.0: vgaarb: setting as boot VGA
device
[ 0.109981] pci 0000:01:00.0: vgaarb: VGA device added:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 337


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

decodes=io+mem,owns=io+mem,locks=none
[ 0.109981] pci 0000:01:00.0: vgaarb: bridge control possible
[ 0.109981] vgaarb: loaded

GPIO

A interface de entrada e saída de uso geral (GPIO) tornou-se popular com pequenos sistemas
Linux projetados para controlar dispositivos externos, geralmente e, projetos de automação.

Isso inclui os populares sistemas Linux Raspberry Pi, BeagleBone e Banana PI.

A interface GPIO fornece várias linhas de entrada e saída digitais que podem ser controladas
individualmente. A função GPIO é normalmente tratada por um chip de circuito integrado
especializado (CI), que é mapeado na memória no sistema Linux.

A interface GPIO é ideal para suportar comunicações com dispositivos externos, como relés,
luzes, sensores e motores. Uma infinidade de coisas podem ser feitas com essa interface de
comunicação, uma vez que os aplicativos podem através do GPIO ler o status de
interruptores, ligar ou desligar relés ou ler valores digitais de sensores de temperatura,
pressão, RFID, etc.

Figura 19 - GPIO do Raspberry PI 3


338 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

Impressoras e Impressão no Linux

Este capítulo descreve como configurar e imprimir em sistemas Linux utilizando o spooler
local de impressão, impressão em rede e impressão em redes Windows utilizando o SAMBA.

Por anos o problema de impressão flagelou o Linux. Ao contrário do Microsoft Windows ou do


Mac OS, o Linux não tinha nenhum suporte ou sistema padrão para lidar com impressoras.

O pacote CUPS (Common Unix Printing System) foi projetado para eliminar o problema
impressão no UNIX e no Linux pois pode ser usado por todas as suas variantes. Ele possui um
filtro de impressão modular que pode ser adaptado pelos fabricantes de impressoras de
forma fácil permitindo seu uso. Os comandos do pacote CUPS fornecem suporte a impressão,
gerência de documentos impressos e impressão remota.

Para que possamos trabalhar com impressão, é necessário que o suporte a portas paralelas
ou suporte a dispositivos USB estejam compilados no Kernel.

Os comandos nativos do sistema para impressão fazem parte do pacote desenvolvido para o
Unix chamado lpd. Ele funciona como um daemon, provendo serviços de impressão. Este
processo fica constantemente verificando uma fila de trabalhos a serem impressos, e se
encarrega de imprimir quando um arquivo novo chega.

Este sistema utiliza uma fila de impressão porque as impressoras são dispositivos geralmente
lentos, com pouca memória e com alta probabilidade de erros. Assim, o sistema precisa
gerenciar os documentos para que tudo possa funcionar corretamente.

O servidor CUPS pode ser instalado através de um gerenciador de pacotes, como o apt-get
ou yum:

$ sudo apt-get install cups

O comportamento do servidor CUPS é configurado através do arquivo /etc/cups/cupsd.conf.

O servidor cups pode ser iniciado com o comando:

# systemctl start cups

Uma vez iniciado o servidor CUPS, ele pode ser acessado através de um navegador na porta
631 do host em questão:

http://maquina.dominiolocal:631 ou mesmo http://localhost:631

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 339


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Figura 20 - Cups no Ubuntu

Neste servidor web é possível configurar impressoras, gerenciar filas de impressão, etc. Não
é necessário adicionar ou remover impressoras manualmente alterando os arquivos de
configuração.

Partes importantes do site de administração do Cups são:

Jobs: usada para checar os jobs e impressão.


Administration: Para adicionar impressoras, gerenciar os jobs e configurar o Cups
server.
Printers: mostra as impressoras

Gerenciamento de Impressoras
O pacote lpd conta com os seguintes comandos:

lpr: É também conhecido como line print. Ele envia trabalhos para a fila de
impressão;
lpq: Este comando mostra o status da fila (queue) de impressão;
lprm: Este comando remove (rm) trabalhos da fila;
lpc: Comando de administração e controle da fila de impressão.

340 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

O daemon lpd precisa ser executado como superusuário para que ele possa dar acesso aos
recursos de impressão para os usuários.

A configuração deste sistema é gravada no arquivo /etc/printcap. Ele contém os nomes das
impressoras e regras de impressão. O lpd conta ainda com arquivos especiais chamados de
filtros, que têm a habilidade de converter trabalhos de impressão em um formato com que a
impressora possa lidar.

Os trabalhos que são enviados para a fila de impressão são armazenados no diretório
/var/spool/lpd até que a impressora esteja pronta para impressão. Cada impressora
configurada no sistema possui um subdiretório com o seu nome.

Instalando uma Impressora manualmente


Para testarmos se um dispositivo de impressora está corretamente configurado no sistema e
fisicamente conectado ao computador, devemos imprimir um arquivo texto diretamente.

Isto é feito direcionando a saída ou o texto com o sinal maior-que “>” para a porta de
impressora. Os dispositivos de impressão paralela são nomeados como /dev/lp0 para LPT1
e /dev/lp1 para LPT2. As impressoras conectadas a portas USB utilizam os dispositivos
/dev/usb/lp0.

$ echo “TESTE DE IMPRESSAO” > /dev/lpt0

Depois de certificarmos a conexão com a impressora no sistema é necessário fazer a


configuração do dispositivo no arquivo /etc/printcap.

A primeira linha deste arquivo configura o nome da impressora. Mais de um nome pode ser
especificado, separando-os com o sinal “|” pipe. Cada impressora deve ocupar somente uma
linha no arquivo ou utilizar a contrabarra “\” para indicar que a configuração para uma
mesma impressora continua na próxima linha. Os parâmetros devem ser separados pelo dois
pontos “:”.

Veja um exemplo:

lp|djet500|djet500-a4 with lprMagic Universal Filter:\


:lp=/dev/lp1:\
:sd=/var/spool/lpd/djet500:\
:lf=/var/spool/lpd/djet500/log:\
:af=/var/spool/lpd/djet500/acct:\
:if=/usr/local/lprMagic/unifilter:\
:mx#0:\
:sh:

Os parâmetros que podem ser definidos neste arquivo são:

lp: Dispositivo onde a impressora está conectada. /dev/lp0 ou /dev/lp1 para portas

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 341


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

paralelas e /dev/usb/usblp0 para impressoras USB;


sd: Especifica o diretório de spool local para armazenar a fila de impressão. Cada
impressora deve ter o seu diretório;
lf: Especifica a localização do arquivo de log para o sistema escrever mensagens de
erro de impressão;
af: Especifica o arquivo de contabilidade de impressão, onde serão gravados os
dados sobre o uso da impressora;
if: Especifica o local do programa que será executado para transformar os arquivos
de impressão para o formato suportado pela impressora. São os filtros de impressão;
mx#nnn: Tamanho máximo em blocos do arquivo que poderá ser impresso, onde nnn
especifica os blocos. Se for informado zero, o tamanho será ilimitado;
sh: Suprime a impressão do cabeçalho de impressão. É útil para identificação do
usuário dono do documento impresso.

Impressoras locais e remotas precisam ser configuradas no /etc/printcap.

Comandos da Interface Legada do Cups

O Cups possui uma interface "legada" no prompt do shell, quando sua administração não
possuia uma página Web para realizar as configurações e gerenciamento de impressoras e
impressões. Conhecer esses comandos faz parte do exame.

lp
Uso: $ lp [opções] [arquivos]

O comando lp também imprime arquivos. Ele possui algumas opções a mais que o lpr.

As opções mais frequentes são:

-w: Envia mensagem na tela ao término da impressão;


-dnome: Especifica o nome da impressora;
-Hcomando: Imprime o arquivo de acordo com os comandos:
hold: Pausa a impressão de um determinado trabalho;
resume: Volta a imprimir um trabalho pausado;
immediate: Avança o trabalho na fila de impressão para o próximo a ser impresso;
-nx: Especifica um número x de cópias a serem impressas.

Exemplo:

$ lp LEIAME.TXT

342 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

lpq
Uso: $ lpq [opções] [usuário] [trabalhos]

O comando lpq lista o conteúdo da fila de impressão. Este comando pode filtrar os trabalhos
pelo seu número, pelo usuário e pelo nome da impressora.

As opções mais frequentes são:

-Pnome: Mostra a fila de impressão de uma determinada impressora;


-l: Fornece mais detalhes da fila de impressão.

Exemplos:

$ lpq
Rank Owner Job Files
Active joao 483 INSTALL
2rd neide 484 RFC137
3rd cristiane 485 relatorio.ps
4rd carla 486 notas.txt

lprm
Uso: $ lprm [opções] [usuário] [trabalho]

Este comando remove da fila de impressão um determinado trabalho ou trabalhos de um


determinado usuário.

A opção possível é:

-Pnome: Especifica o nome da impressora.

Exemplo:

$ lprm -

Remove os trabalhos do usuário logado.

lpc
Uso: $ lpc [comando]

O lpc controla as operações de impressão de uma ou mais impressoras. Ele pode ser usado
para iniciar ou parar os trabalhos, habilitar ou desabilitar uma fila de impressão, rearranjar os
trabalhos na fila, dentre outras opções.

Se nenhum parâmetro for passado como argumento, o lpc executa em modo interativo

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 343


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

habilitando seu próprio interpretador de comandos.

Os possíveis comandos são:

? comando: Fornece ajuda para o comando especificado;


abort [all/impressora]: Termina todos os trabalhos de impressão imediatamente e
desabilita o serviço;
clean [all/impressora]: Remove todos os arquivos na fila de impressão;
disable [all/impressora]: Desabilita a entrada de novos trabalhos de impressão na
fila.
down [all/impressora]: Desabilita a entrada de novos trabalhos [mensagem] de
impressão na fila e avisa os usuários através de uma mensagem personalizada;
enable [all/impressora]: Habilita o serviço de impressão;
exit: Sai do modo interativo do lpc;
restart [all/impressora]: Reinicia o serviço de impressão. É utilizado quando alguma
condição anormal parou o lpd;
start [all/impressora]: Inicia o serviço e a fila de impressão;
stop [all/impressora]: Para o serviço e a fila de impressão;
topq impressora [usuário] [trabalho]: Move um determinado trabalho pelo número ou
de um usuário para o início da fila de impressão;
up [all/impressora]: Inicia e habilita o serviço de impressão parado pelo comando
down;
status [all/impressora]: Exibe o status das impressoras.

Exemplos:

Para ver o status de uma impressora:

$ lpc status
lp:
queuing is enabled
printing is enabled
4 entries in spool area
lp is ready and printing

Para disabilitar uma impressora:

# lpc disable lp
lp:
queuing disabled

344 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Imprimindo Arquivos
Durante o processo de impressão, o sistema precisa lidar com arquivos de diversos formatos,
como texto puro, HTML, PDF, PostScript, gráficos, imagens, documentos do OpenOffice, etc.
As impressoras não suportam esta variedade de padrões e por isto os arquivos precisam ser
transformados em um formato com que as impressoras possam trabalhar.

O filtro é um programa que irá receber um arquivo para ser impresso e transformá-lo em
uma linguagem chamada Linguagem de Descrição de Página (Page Description Language)
que é uma forma de PostScript para Linux.

Depois de transformado em PDL, o arquivo é lido por um aplicativo chamado Ghostscript que
é capaz de interpretá-lo e transformá-lo em um formato específico de cada impressora.

Este processo não é necessário para todos os tipos de arquivos. Os textos em ASCII podem
ser enviados diretamente para a impressora em formato PDL. Algumas impressoras a laser
possuem um interpretador de Postscript próprio dispensando o uso do Ghostscript.

O sistema pode selecionar o tipo de filtro que será utilizado verificando o início de cada
arquivo a ser impresso. Cada arquivo tem uma assinatura própria indicando o seu formato.
Esta assinatura é chamada de número mágico (magic number).

Os dois filtros de impressão mais conhecidos são o APSfilter e o magicfilter.

Cada tipo de trabalho será tratado de forma diferente para que possa ser transformado
corretamente e impresso.

Com a impressora devidamente instalada, vamos aos comandos de gerência, visualização de


filas e impressão.

lpr
Uso: $ lpr [opções] [arquivos]

Este comando envia arquivos para a fila de impressão. Uma cópia do arquivo a ser impresso
é gravada no spool até que a impressão esteja completa.

As opções mais frequentes são:

-#n: Imprime n cópias do arquivo;


-Pnome: Especifica a impressora que será usada. Se esta opção não for declarada, o
sistema vai utilizar a impressora padrão (lp);
-s: Habilita a criação de um link simbólico do arquivo a ser impresso para o diretório
de spool. Evita a cópia desnecessária dos arquivos para impressão.

Exemplos:

Imprime o arquivo documento.txt.

$ lpr documento.txt

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 345


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Imprime as contas de usuários definidas no arquivo passwd na impressora hp.

$ cat /etc/passwd | cut –d”:” –f 1 | lpr –Php

Imprime duas cópias do documento postscript relatório.ps diretamente para a impressora.

$ lpr -#2 –Praw relatório.ps

Instalando Impressoras Remotas em Linux


Adicionar uma impressora remota é relativamente simples. Os parâmetros rp e rm devem
ser adicionados ao arquivo /etc/printcap. Estes comandos especificam o nome da impressora
remota e o nome da máquina onde a impressora está instalada, nesta ordem. A Interface
gráfica do Cups permite fazer a instalação de impressoras remotas sem a necessidade de
alterar qualquer arquivo manualmente.

Veja o exemplo:

laser:\
:lf=/var/spool/lpd/lwerrs:\
:lp=\
:rm=prnsrv:\
:rp=lw:\
:sd=/var/spool/lpd/lw:

A impressora laser está conectada no computador prnsrv com o nome lw. Mesmo remota, a
impressora necessita de uma fila de impressão local. Os trabalhos enviados para laser serão
enviados para o computador prnsrv na impressora de nome lw.

O computador prnsrv precisa rodar o CUPS para receber as impressões.

Instalando Impressoras Remotas em Windows


Assumiremos que o Windows está corretamente configurado e que a impressora está
devidamente compartilhada. O utilitário SAMBA também deve estar instalado. Ele oferece
suporte ao compartilhamento de redes Microsoft Windows para o Linux e outros sistemas.

A configuração do arquivo /etc/printcap para impressoras compartilhadas pelo Microsoft


Windows é:

winprn:\
:if=/usr/bin/smbprint:\
:sd=/var/spool/lpd/winlpd:

346 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

O filtro utilizado para impressão em redes Windows é o utilitário smbprint do pacote do


SAMBA. Ele fará o redirecionamento da impressão.

Dentro do diretório de spool da impressora /var/spool/lpd/winlpd deverá ser criado o arquivo


de configuração .config. Este arquivo terá a seguinte configuração:

# cat /var/spool/lpd/winlpd/.config
server=Jupiter
service=Impressora
password=”1324”

Onde:

O parâmetro server especifica o nome NETBIOS do servidor Windows;


service deverá ser utilizado para especificar o nome da impressora;
password deverá especificar a senha do compartilhamento Windows.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 347


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Simulado
2.8 Interface Gráfica e
Acessibilidade

O Linux possui dois servidores gráficos que proveem ambiente gráfico desktop moderno para
o sistema. O primeiro deles é o X11, que evoluiu e mudou de nome para X.ORG, e o Wayland,
que é um aprimoramento do X.Org.

Arquitetura do X.org
O X.Org usa uma arquitetura Cliente-Servidor. Neste modelo, existe programa que atua como
Servidor X e existem programas clientes que comunicam com esse servidor X.

O Servidor X é responsável por fazer a interface entre os programas-cliente e o usuário. É o


servidor X que se comunica com o teclado, mouse e monitor de vídeo. É o X Server que
comunica diretamente com o Kernel e com os Drivers de vídeo. Ele pode fazer uso de
módulos de aceleração de vídeo, suporte de fontes, composição de vídeo, etc.

Figura 21 - Arquitetura do X

Neste tipo de arquitetura, o X Server e os programas cliente podem executar em uma


mesma máquina, ou em máquinas diferentes, e até mesmo de arquiteturas diferentes. A
comunicação entre o servidor e o cliente X usa o protocolo X11 Network Protocol e pode ser

348 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

feita pela Internet, de forma segura, em redes privadas VPN e até encriptada.

O X.Org utiliza a porta TCP 6000 para se comunicar entre as aplicações clientes e o X Server.

Window Manager
A parte gráfica do ambiente que dá forma as janelas, ícones, contornos de tela, decoração e
aparência é chamado de gerenciador de janelas. Ele adiciona mais uma "camada",
responsável por dar uma forma "bonita" e amigável para o usuário das janelas das
aplicações. É o gerenciador de janelas que compõe os contornos, botões de janela e toda a
decoração. Isto facilita muito o trabalho do desenvolvedor, que não precisa se preocupar com
uma série de detalhes e adequações e de "preferências do usuário", deixando isso a cargo do
gerenciador de janelas.

Ele da a forma para que as janelas do aplicativo se apresentem ao usuário, bem como
gerencia as várias janelas de aplicativos, mantendo o controle de quais estão abertas e
fornecendo recursos para alternar entre elas.

Figura 22 - Frame Window

No X.Org o gerenciador de janelas funciona como um programa-cliente para o X Server que


"captura" as transações entre as aplicações e o X Server, adicionando toda a aparência e
decoração. Ele funciona como uma aplicação comum, mas faz chamadas especiais de
captura de instruções das outras aplicações, adiciona toda a decoração das janelas, e envia a
janela decorada para a placa de vídeo.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 349


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Figura 23 - Window Manager

Uma vez que o gerenciador de janelas é um programa cliente do X Server, esta arquitetura
permite que o usuário escolha seu gerenciador de janelas preferido, com suas preferências
de fundo, cores, botões, contornos, aparência, etc.

Display Manager
No X Window System ainda existe um outro componente chamado de Display Manager que é
um gerenciador de login gráfico que inicia uma sessão em um servidor X a partir do mesmo
computador ou de um computador remoto. A função do Display Manager é apresentar ao
usuário uma tela de login e fornecer um meio de autenticação. Desta forma, uma sessão é
iniciada quando um usuário insere com êxito uma combinação válida de nome de usuário e
senha.

Existem vários Displays Managers disponíveis, a saber:

GDM - Gnome Display Manager


LXDM - LXDE Display Manager
XDM - X.Org Display Manager
LightDM - Light Display Manager
SDDM - Simple Desktop Display Manager (sucessor do KDM)

350 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Figura 24 - Display Manager

Selecionando um Display Manager padrão


O usuário pode optar por instalar seu gerenciador de exibição padrão através da instalação
do pacote com o Display Manager apropriado.

Sempre que um pacote do Display Manager for instalado e configurado, ele tentará detectar
se há outro gerenciador de exibição instalado no momento. Se assim for, abrirá uma caixa de
diálogo perguntando qual você gostaria de usar como padrão. Para alterar isso mais tarde,
você pode reconfigurar qualquer pacote do gerenciador de exibição instalado e a caixa de
diálogo reaparecerá. Por exemplo:

# dpkg-reconfigure lightdm
# dpkg-reconfigure gdm3
# dpkg-reconfigure sddm

Qualquer um destes seria válido. Observe também que suas opções não estão limitadas a
esses três pacotes, mas elas são fornecidas como exemplos comuns de pacotes do Display
Manager instalados.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 351


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Desktops Gráficos
Uma outra abstração da arquitetura do X.Org é o ambiente de Desktop, ou Desktop gráfico.

Esse conceito pode ser dividido em vários componentes que funcionam de forma
independente e interagem entre si para fornecer a aparência e a funcionalidade do ambiente
de trabalho.

Uma parte fundamental de um Desktop Gráfico é o Window Manager (gerenciador de


janelas). Outra parte importante desta abstração é o software de Gerenciamento de Arquivos
(como o explorer do Windows, ou File Manager do Linux), responsável por gerenciar arquivos
e pastas e apresenta-os de uma forma que o usuário ache conveniente.

O Gerenciador de Arquivos também fornece operações de arquivo como visualização, cópia


ou movimentação, alteração de permissões e exclusão.

Os Desktop Gráficos geralmente fornecem também utilitários para definir papéis de parede e
protetores de tela, exibir ícones na área de trabalho e executar algumas tarefas
administrativas. Eles podem, opcionalmente, incluir processadores de texto, aplicativos de
gravação de CD/DVD, navegadores de Internet e clientes de e-mail.

Algumas distribuições permitem que o usuário escolha qual ambiente de Desktop quer
utilizar no momento da instalação. Mas a maioria vem com um gerenciador pré-determinado,
que dá a característica à distribuição.

Os Desktops Gráficos mais comuns são:

KDE
LXDE
GNOME
MATE
Cinnamon
Enlightement

O Desktop Gráfico UNITY foi descontinuado pelo Ubuntu à partir da versão 18.04 do sistema,
uma vez que a Canonical adotou o GNOME como interface Desktop padrão.

Instalação do X.Org
O melhor local para baixar o X.Org é diretamente do repositório da distribuição, pois o
próprio site do X.org não fornece os binários do projeto.

A melhor maneira de fazer a instalação do Ambiente Gráfico é através de Grupos de Software


que as distribuições criam para facilitar, instalando vários pacotes relacionados de uma só
vez, facilitando assim a administração do sistema. Um grupo de software de um Desktop
Gráfico já instala os pacotes do X.Org como dependência do ambiente gráfico.

Em um Linux baseado em RPM, pode-se utilizado o comando "yum grouplist" para ver a lista
de grupos de pacotes relacionados a um determinado ambiente gráfico:

352 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

# yum grouplist
Ambiente de trabalho Cinnamon
Ambiente de trabalho MATE
KDE Desktop.
Xfce

Para instalar algum ambiente gráfico, como por exemplo o XFCE:

# yum groupinstall Xfce

O mesmo pode ser feito em um Linux baseado em Debian, utilizando o comando apt-cache,
buscando os "metapacotes" que funcionam como os grupos de pacotes do Yum:

# apt-cache search . | grep -i "metapackage\|meta-package" | grep


Desktop
mate-desktop-environment - MATE Desktop Environment (metapackage)
mate-desktop-environment-core - MATE Desktop Environment (essential
components, metapackage)
mate-desktop-environment-extras - MATE Desktop Environment (extra
components, metapackage)
xfce4 - Meta-package for the Xfce Lightweight Desktop Environment

Para instalar, utiliza-se o apt, com o nome do meta-pacote:

# apt install xfce4

Configurando o X Server
A configuração do X pode variar de acordo com a preferência de cada distribuição Linux. Mas
geralmente o X.Org cria um arquivo de configuração chamado xorg.conf.

Este arquivo é criado durante o processo de instalação, quando o chipset, monitor, teclado,
mouse e outros periféricos de entrada e saída de dados são detectados e configurados.
Geralmente ele fica no diretório /etc/X11/.

No entanto, é importante você saber que dependendo da distribuição, as configurações do


X.Org podem ser encontradas nos seguintes diretórios:

/etc/X11/
/usr/etc/X11/
/etc/X11/xorg.conf.d

O diretório /etc/X11/xorg.conf.d tem sido preferido pela maioria das distribuições para
guardar vários arquivos com extensão ".conf" que antigamente compunham o xorg.conf.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 353


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Assim, para melhor organização, a configuração foi dividida em pequenos arquivos, cada um
com uma configuração específica:

$ ls -1 /etc/X11/xorg.conf.d/
00-keyboard.conf
10-libvnc.conf
90-prlmouse.conf

xorg.conf

Este é o principal arquivo de configuração do X11, e contém as seguintes configurações:

Caminho do diretório das fontes (Ex. Arial, Times, Sans, etc);


Quais módulos serão carregados;
Quais são os dispositivos de entrada de dados (teclado, mouse, mesas digitais, etc.);
Qual o chipset de vídeo;
Qual o tipo de monitor;
Quais as resoluções de tela suportadas;

Este arquivo é dividido em sessões:

“Files”: Especifica o caminho das fontes, base de dados RGB e dispositivos de


entrada;
“Module”: Configura os módulos extras que serão carregados;
“InputDevice”: Configura o tipo de teclado e mouse;
“Monitor”: Configura o tipo de monitor;
“Modes”: Configura os modos de resolução e cores suportados;
“Screen”: Configura os modos de vídeo de acordo com as configurações do monitor e
placa de vídeo;
“Device”: Configura o módulo do driver de vídeo;
“ServerLayout”: Configurações extras do X que amarram as sessões Screen e Input-
Device.

Veja no exemplo um pedaço do Xorg.conf:

Section "Files"
ModulePath "/usr/lib/xorg/modules"
FontPath "/usr/share/fonts/misc"
FontPath "/usr/share/fonts/100dpi:unscaled"
FontPath "/usr/share/fonts/75dpi:unscaled"
FontPath "/usr/share/fonts/TTF"
FontPath "/usr/share/fonts/Type1"
EndSection
354 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

Section "InputDevice"
Identifier "Keyboard0"
Driver "kbd"
EndSection
Section "InputDevice"
Identifier "Mouse0"
Driver "mouse"
Option "Protocol" "auto"
Option "Device" "/dev/input/mice"
Option "ZAxisMapping" "4 5 6 7"
EndSection

É importante que você memorize para o exame:

O xorg.conf é dividido em sessões, que começam com a palavra "Section" e terminam


com "EndSection";
Cada sessão tem seu nome, indicando sua função;

Configurações de Layout de Teclado


Faz parte do exame saber alterar o layout de teclado do X.Org. Para fazer isso você precisa
procurar a sessão "InputDevice" e o identificador "keyboard" no arquivo xorg.conf se ele
existir, ou procurar o arquivo de configuração de teclado no diretório /etc/X11/xorg.conf.d.

$ cat /etc/X11/xorg.conf.d/00-keyboard.conf
Section "InputClass"
Identifier "system-keyboard"
MatchIsKeyboard "on"
Option "XkbLayout" "us"
EndSection

A opção XkbLayout pode ser alterada por exemplo para o teclado ABNT:

Section "InputClass"
Identifier "system-keyboard""
MatchIsKeyboard "on"
Option "CoreKeyboard"
Option "XkbRules" "xorg"
Option "XkbModel" "abnt2"
Option "XkbLayout" "br"
EndSection

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 355


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Acesso Remoto ao Servidor X Window


O X.org permite que máquinas remotas possam se conectar no servidor X Window e iniciar
aplicações remotamente, com espelhamento da tela para a máquina remota.

xhost

O aplicativo xhost é um programa de controle de acesso ao X Server, que pode ser utilizado
para adicionar ou apagar hostnames ou usuários na lista de permissões de acesso ao X
Window Server.

Se utilizado sem nenhum parâmetro, o xhost mostra uma lista de usuários ou hostnames que
estão autorizados a conectar no X Server:

$ xhost
access control enable, only authorized clientes can connect
INET:notebook1.certificacaolinux.com.br

No exemplo acima, o host notebook1.certificacaolinux.com.br está autorizado a conectar no


X Server.

Para adicionar um host, basta informar o nome do host sucedido do sinal + :

$ xhost +notebook2.certificacaolinux.com.br

Para remover um host, apenas troque o sinal + por - :

$ xhost -notebook2.certificacaolinux.com.br

Nunca abra o servidor para qualquer cliente, com o comando abaixo, pois isto representa
uma brecha na segurança do seu host:

$ xhost +
access control disabled, clientes can connect from any host

Variável DISPLAY

Como o X.Org é um sistema de interface gráfica ao usuário que trabalha no modelo


cliente/servidor, ele possibilita executar aplicações gráficas em um servidor e controlar a
aplicação de outra máquina. Para habilitar este recurso, basta informar na linha de comando
(no terminal) qual o host para o qual o aplicativo deve enviar suas telas alterando a variável
DISPLAY.

$ export DISPLAY=notebook1.certificacaolinux.com.br:0.0

356 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Desta forma, as aplicações X terão suas telas enviadas para o


notebook1.certificacaolinux.com.br, e executadas localmente. Isso possibilita que você possa
rodar aplicações gráficas remotas, enxergando as telas na sua máquina local.

Como exemplo, você pode se conectar via SSH em um servidor remoto


(exemplo:servidor1.certificacaolinux.com.br) e alterar a variável DISPLAY para jogar as telas
das aplicações X na tela do seu notebook (notebook1.certificacaolinux.com.br).

A opção "-X" do ssh habilita o envio da porta X11 via SSH. A opção "-Y" também pode ser
usada para o X11forwarding com conexão confiável.

No lado servidor é preciso que a opção "X11Forwarding yes" esteja habilitada no


/etc/ssh/sshd_config. Na maioria das distribuições esta opção vem desabilitada por padrão.

Uma vez que você conecte em um host que esteja executando o X.Org, com a opção -X ou -Y
do ssh, você pode executar as aplicações X normalmente.

A opção "-Y" ou "-X" do ssh já altera automaticamente a variável DISPLAY, sem a necessidade
de alterar manualmente.

$ ssh -X uira@servidor1.certificacaolinux.com.br
$ xterm

Figura 25 - Variável Display

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 357


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Observe na figura 6 que um CentOS conectou em um host chamado "ubuntu" usando o ssh
com a opção "-Y" e depois o usuário executou o xterm. Desta forma, a tela do terminal
gráfico do xterm está executando no host ubuntu, e a tela está sendo enviada para o host
local CentOs.

A variável DISPLAY é composta de:

Hostname:D.S

Onde:

Hostname: é o endereço do computador que executa o X Server. Se for omitido o


hostname, o sistema entende que o hostname é a máquina local (localhost).

D: é um número sequencial que geralmente significa o monitor conectado ao computador.


Geralmente o valor é zero.

S: é o número da tela. Um monitor pode ter várias telas. Geralmente só há uma e o valor é
geralmente zero.

Depois de configurar a variável DISPLAY, você pode executar normalmente os aplicativos


gráficos.

xauth

O método XAuth de controle de acesso garante que os aplicativos X tenham autorização


antes de permitir que eles se conectem a um servidor X.

As credenciais de autorização assumem a forma de um “cookie mágico” específico para


exibição que o aplicativo X deve apresentar ao servidor X. Se o cookie coincidir com o que o
servidor tem, então ele permitirá o acesso a esse aplicativo.

O "Magic Cookie"' é um número em hexadecimal gerado pelo XDM, ou pelo próprio usuário,
geralmente gravado no diretório HOME no arquivo .Xauthority com permissão de somente
leitura e gravação pelo próprio usuário:

$ ls -lga ~/.Xauthority
-rw------- 1 uiraribeiro 52 Oct 15 08:13 .Xauthority

Para ver o conteúdo do arquivo .Xauthority, o comando xauth list pode ser usado:

$ xauth list
ubuntu/unix:10 MIT-MAGIC-COOKIE-1
05017278fd424f204937dc2745d82b5d

Em destaque o MAGIC-COOKIE em amarelo.

358 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Para exempificar a utilização do xauth, imagine que você precisa executar um programa
gráfico remotamente, mas este programa precisa ser executado com as permissões de um
usuário especifico que não é o usuário que você usou para se conectar no servidor. A forma
de passar as permissões de executar aplicativos X do usuário uiraribeiro para outro usuário
facilmente é com o xauth.

Isto é comum por exemplo na instalação do banco de dados da Oracle, que pede que seja o
instalador executado com um usuário chamado "oracle".

Desta forma o usuário pode se conectar no servidor usando o ssh com a opção -Y:

$ ssh -Y uiraribeiro@ubuntu
uiraribeiro@ubuntu:~$

E então verificar qual é o "Magic Coockie" do usuário:

uiraribeiro@ubuntu:~$ xauth list


ubuntu/unix:10 MIT-MAGIC-COOKIE-1
7b09953bba105ece6b42ab4a62789508

Agora, é possível executar um shell como novo usuário com o comando "sudo su oracle -":

uiraribeiro@ubuntu:~$ sudo su oracle -


oracle@ubuntu:~$

Se tentarmos executar qualquer programa X, não será possível porque não há permissão
para o usuário oracle:

oracle@ubuntu:~$ xterm
X11 connection rejected because of wrong authentication.
xterm: Xt error: Can't open display: localhost:10.0

Então é preciso adicionar o MAGIC-COOKIE para o usuário oracle com o comando xauth add,
copiando a linha que o comando "xauth list" gerou para o usuário uiraribeiro:

oracle@ubuntu:~$ xauth add ubuntu/unix:10 MIT-MAGIC-COOKIE-1


7b09953bba105ece6b42ab4a62789508

Uma vez adicionado o MAGIC-COOKIE do usuário uiraribeiro para o usuário oracle, é possível
executar o instalador do Oracle, conforme a figura a seguir:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 359


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Figura 26 - xauth

.xsession-errors

As interfaces gráficas Linux (como o GNOME) fornecem uma maneira de executar aplicativos
clicando em ícones em vez de executá-los manualmente na linha de comando.

No entanto, ao fazê-lo, a saída da linha de comando é perdida - especialmente a saída de


erro (STDERR).

Para lidar com isso, alguns gerenciadores de exibição (como GDM) canalizam a saída de erro
para ~/.xsession-errors, que podem então ser usados para fins de depuração.

Note que, uma vez que todas as aplicações executadas desta forma despejam a saída para
o ~/.xsession-errors, ele pode ficar bastante grande e difícil encontrar mensagens
específicas.

Executando o X.Org
Para executar o ambiente gráfico diretamente do terminal em modo texto, basta digitar "X":

$ X

Wayland
360 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

O Wayland é um substituto mais simples do X.Org, mais fácil de desenvolver e manter.

Seu criador, Kristian Høgsberg, também é programador do X.Org e iniciou o Wayland em


2008 como um projeto de tempo livre enquanto trabalhava para a Red Hat.

O objetivo do Wayland é permitir que as aplicações possam controlar a renderização, sem


sombras, atrasos, redesenhamento ou cintilação, além de retirar camadas e camadas de
software do X.Org que não são mais utilizadas.

O nome Wayland se deve ao fato de Høgsberg estar dirigindo pela cidade de Wayland,
Massachusetts, quando os conceitos do software "cristalizaram" em sua mente.

O Wayland simplificou a arquitertura do X.Org, de forma que o X Server e o Windows


Manager são um só componente, simplificando a arquiterura do servidor gráfico.

Figura 27 - Arquitetura do Wayland

O que tem de "errado" com o X.Org?


O problema com X.Org é que há uma enorme quantidade de funcionalidades que existem no
protocolo X, mas que dificilmente será usado nos Desktops modernos.

Por exemplo, a API de renderização do X.Org permite desenhar linhas pontilhadas, polígonos,
arcos largos e muitas outras funções de gráficos primitivos da década de 1980. Ninguém

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 361


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

praticamente usa isso mais. Então, seu grande problema é o "software legado"
desnecessário, que é difícil de ficar livre.

E para manter o X.Org moderno, foram adicionadas extensões como XRandr, XRender e
COMPOSTE.

Com o Wayland foi possível substituir o servidor X por algo moderno, utilizado por Desktops e
placas gráficas atuais, e ainda manter a tecnologia legada do X.Org como código opcional.

As seguintes distribuições usam o Wayland como servidor gráfico:

O Fedora a partir da versão 25 usa o Wayland como sessão padrão do desktop


GNOME 3.22.
O Ubuntu usa o Wayland como padrão na versão 17.10.
O KDE Neon Developer Edition tem suporte ao Wayland.
O Arch Linux vem com o Wayland habilitado por padrão em vários ambientes
desktop.

Desktops Gráficos

Sem dúvida uma das belezas do Linux é a sua pluralidade de ambientes gráficos para todos
os gostos, através de inúmeras distribuições e ainda assim manter toda a conformidade de
ser um sistema operacional padrão.

Ao longo do tempo diversos ambientes gráficos foram construídos para funcionar no X.Org, e
recentemente, migrados para o Wayland.

Dentre eles, o exame cobra algum conhecimento sobre os ambientes KDE, GNOME, XFCE e
também alguns protocolos de acesso remoto.

KDE
O KDE é uma grande comunidade de desenvolvedores desde 1996 que desenvolvem um
ambiente gráfico multiplataforma conhecido como KDE Plasma. Seu nome deriva de K
Desktop Environment, e a letra "K" foi escolhida simplesmente porque vem depois de "L" de
Linux. O KDE e seus aplicativos são escritos com o framework Qt.

O objetivo da comunidade KDE é tanto providenciar um ambiente que ofereça os aplicativos


e funcionalidades básicas para as necessidades diária quanto permitir que os
desenvolvedores tenham todas as ferramentas e documentação necessárias para simplificar
o desenvolvimento de aplicativos para a plataforma.

O KDE se baseia no princípio da facilidade de uso e da personalização. Todos os elementos


do ambiente gráfico podem ser personalizados: painéis, botões das janelas, menus e
elementos diversos como relógios, calculadoras e miniaplicativos. A extrema flexibilidade
para personalização da aparência permite até que temas sejam compartilhados pelos
usuários.
362 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

O gerenciador de janelas KWin é responsável por fornecer uma interface gráfica organizada e
consistente, e barra de tarefas intuitiva.

Figura 28 - KDE Plasma com Tema OSX

Figura 29 - KDE Plasma outra variação estilo OSX

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 363


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Figura 30 - KDE Plasma estilo Windows

GNOME
O GNOME (acrônimo para GNU Network Object Model Environment) é um projeto de
software livre para ambiente gráfico também multiplataforma com ênfase especial a
usabilidade, acessibilidade e internacionalização.

O Projeto GNOME é mantido por diversas organizações e desenvolvedores e faz parte do


Projeto GNU. Seu principal contribuidor e mantenedor é a Red Hat.

O GNOME 3 é o ambiente gráfico padrão de grandes distribuições como Fedora, SUSE Linux,
Debian, Ubuntu, Red Hat Enterprise, CentOS e tantos outros.

Há ainda uma divisão do GNOME 2 conhecida como MATE, uma vez que a mudança no
ambiente do GNOME 2 para o GNOME 3 foi grande, e alguns usuários simplesmente
preferiram ficar com o ambiente mais parecido com o GNOME 2.

Criado por dois mexicanos em 1997, descontentes na época com a falta de software livre
para o Framework Qt, utilizado para desenvolvimento de aplicações para o KDE.

Desta forma, eles preferiram utilizar o GTK (Gimp Tool Kit) como framework padrão para o
desenvolvimento do GNOME, uma vez que este já era licenciado pela GPL.

O GNOME 1 e 2 seguiram a tradicional da área de trabalho com "barra de tarefas".

O GNOME 3 mudou isso com o GNOME Shell, com um ambiente abstrato onde a alternância
entre diferentes tarefas e desktops virtuais ocorre em uma área separada chamada “Visão
364 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

Geral”.

Figura 31 - GNOME 3 no CentOS

Figura 32 - GNOME 3 no Ubuntu

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 365


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Figura 33 - MATE no Linux Mint

Xfce
Xfce é um ambiente de Desktop para sistemas operacionais Unix Like, como Linux e BSD,
fundado em 1996.

O Xfce tem objetivo de ser leve, rápido e visualmente atraente. Ele incorpora a filosofia Unix
de modularidade e reutilização e consiste em partes separadas empacotadas que, juntas,
fornecem todas as funções do ambiente de trabalho, mas podem ser selecionadas em
subconjuntos para atender às necessidades e preferências do usuário.

Como no GNOME, o Xfce é baseado no framework GTK, mas é um projeto totalmente


diferente.

Ele é muito utilizado em distribuições que tem a intenção de serem leves, especialmente
projetadas para rodar em hardware antigos.

O Xfce pode ser instalado em diversas plataformas UNIX, tais como NetBSD, FreeBSD,
OpenBSD, Solaris, Cygwin, MacOS X, etc.

Dentre as distribuições que usam o Xfce, podemos citar:

Linux Mint Xfce edition


Xubuntu
Manjaro
Arch Linux
Linux Lite

366 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Figura 34 - Xfce no Linux Mint

Figura 35 - Xfce no Linux Manjaro

Cinnamon
O Cinnamon é um projeto de desktop gráfico derivado do GNOME 2, criado pelo pessoal do
Linux Mint. Sua experiência de usuário é muito parecida com o Windows XP, 2000, Vista e 7,
facilitando a curva de aprendizagem de usuários que tenham migrado destes sistemas
operacionais.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 367


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Figura 36 - Cinnamon no Linux Mint

Protocolos de Acesso Remoto

Além do protocolo X11 utilizado pelo X.Org para conceder acesso remoto ao ambiente
gráfico, outras ferramentas e protocolos também podem ser usados para permitir acesso à
sessão de Desktop de forma remota, tais como: XDMCP, VNC, Spice e RDP.

X11
O protocolo X11 é a forma de comunicação nativa entre o X.Org Server e aplicações X.

Ele usa o TCP como protocolo de transporte, tipicamente entre a porta 6000 até 6063,
iniciando na porta 6000, somado ao número do Display.

O controle de acesso ao protocolo pode se dar através de firewall, restringindo o acesso as


portas 6000-6063 somente à hosts permitidos, além do controle na aplicação com o
comando xhost.

XDMCP
A arquitetura do X.Org é tão modular que permite que o Gerenciador de Janelas execute no
mesmo host que o X Server, ou remotamente em outro host.

O protocolo XDMCP (acrônimo para X Display Manager Control Protocol) foi criado para
formatar a comunicação entre o X Server e o X Window Display Manager.

Ele usa o protocolo de transporte UDP na porta 177 e é inseguro, pois não criptografa seu
tráfego.
368 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

O XDMCP é análogo ao telnet e, portanto, compartilha os mesmos problemas de segurança,


permitindo, por exemplo por meio de uma rede sem fio, que qualquer pessoa possa "ouvir" o
tráfego e gravar facilmente as sequências de teclas digitadas.

VNC
VNC é um conjunto de aplicativos que podem ser usados para acesso remoto ao ambiente
gráfico. Ele consiste de um servidor, que fica escutando na porta TCP 5900, e um VNC
Cliente, capaz de conectar nesta num servidor executando o VNC Server.

Ele é bastante utilizado para acesso remoto, uma vez que é multiplataforma, permitindo
acesso remoto em Windows, Mac OS, Linux, AIX, HP-UX e Solaris.

Tão versátil, o cliente VNC pode ser executado na plataforma Java e em Mobile como nos
dispositivos Apple iPhone, iPod touch, iPad e também no Google Android.

Sua autenticação é simples, através de uma senha configurada no VNC Servidor.

SPICE
O SPICE (acrônimo para Simple Protocol for Independent Computing Environments) é um
sistema de exibição remota criado para ambientes virtuais que permite visualizar ambiente
Desktop numa grande variedade de arquiteturas.

De todos os protocolos de conexão remota, o SPICE é o mais poderoso deles, pois fornece
uma solução completa de acesso remoto a máquinas virtuais que permite reproduzir vídeos,
gravar áudio, compartilhar dispositivos usb e compartilhar pastas sem complicações.

SPICE pode ser dividido em 4 componentes diferentes: protocolo, cliente, servidor e


convidado:

O protocolo é a especificação na comunicação dos três outros componentes;


Um cliente é o visualizador remoto responsável por enviar dados e traduzir os dados
da Máquina Virtual (VM) para que você possa interagir com ele;
O servidor SPICE é a biblioteca usada pelo hipervisor (Sistema Operacional Host), a
fim de compartilhar a Máquina Virtual em Protocolo SPICE;
O convidado é todo o software que deve ser executado na Máquina Virtual, a fim de
tornar SPICE totalmente funcional, como o driver QXL e SPICE VDAgent.

O SPICE é especialmente projetado para fornecer acesso remoto a máquinas virtuais com a
experiência de uma máquina local.

RDP
O RDP (acrônimo para Remote Desktop Protocol ) é um protocolo multi-canal criado pela
Microsoft para acesso remoto ao Desktop.

Existem clientes RDP para a maioria das versões do Windows, e também para o Linux.

O servidor RDP escuta por padrão na porta TCP 3389.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 369


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

O FreeRDP é uma implementação do RDP sob os termos do software livre, estando licenciado
pela Apache License. Seguindo as Open Specifications da Microsoft, o FreeRDP fornece uma
aplicação cliente para conexões através do protocolo RDP à partir do Linux para Servidores
Windows.

A implementação xrdp também provê o lado servidor do RDP para o Linux, aceitando
conexões de uma variedade de clientes como FreeRDP, rdesktop e do Microsoft Desktop
Client.

NX
O NX criado pela NoMachine é outro protocolo de compartilhamento de área de trabalho
remota. Sua tecnologia na versão 3.5 era open source e disponível sob a licença GNU GPL2.
No entanto, à partir da versão 4 tornou-se proprietário e fonte fechada.

Isso fez com que algumas variações de código aberto fossem implementadas, como o FreeNX
e X2Go.

A tecnologia NX fornece tempo de resposta excelente, mesmo em conexões de baixa largura


de banda, sendo mais rápido do que os produtos baseados em VNC.

O NX usam tunelamento OpenSSH com tráfego é criptografado, o que é ótimo para acesso
remoto via Internet.

Além disso o NX suporta vários usuários simultâneos, compacta os dados X11 e emprega o
uso de cachê para proporcionar uma experiência de desktop remoto aprimorada.

370 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Acessibilidade

A Acessibilidade é a capacidade que um software tem de ser utilizado por pessoas portadoras
de alguma deficiência ou mobilidade limitada. Isso inclui os cegos, pessoas com pouca visão,
surdos, daltônicos, pessoas que só têm uma das mãos ou que só podem mover alguns dedos,
paralisias, dentre outras necessidades especiais.

Nos Ambientes de Desktop existem uma série de recursos de acessibilidade nativos:

Figura 37 - Acessibilidade no GNOME

Acessibilidade implica, além do uso de dispositivos especiais, alguns cuidados do


programador durante o desenvolvimento do software. Por exemplo, um software deve ser
capaz de emitir uma mensagem na tela em conjunto com um alarme sonoro.

Um dos recursos mais utilizados em acessibilidade é o sintetizador de voz, que transformam


o texto em áudio, bem como os ampliadores de tela, que funcionam como uma lupa para
aumentar o tamanho da tela, bem como o forte contraste de cores.

O suporte ao shell em console de texto é relativamente simples, uma vez que os dispositivos
em braile e os sintetizadores de voz são capazes de ler os textos apresentados na tela com
facilidade.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 371


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

O projeto GNOME vem desenvolvendo a AT-SPI (Assistive Technology Service Provider


Interface). Esta interface facilita o desenvolvimento de softwares para leitura de telas, como
o Orca.

O ORCA é um software de código aberto para leitura na tela. Ele utiliza a combinação de
sintetizador de voz, braile e ampliação, Orca ajuda a fornecer acesso a aplicativos e
ferramentas que suportam a AT-SPI. O desenvolvimento da Orca foi conduzido pelo Programa
de Acessibilidade do Office da Sun Microsystems, Inc., com contribuições de muitos membros
da comunidade. O site de acesso ao Orca é http://live.gnome.org/Orca.

No Ubuntu, o Orca pode ser habilitado ou desabilitado com Alt + Shift + S.

A maioria dos ambientes gráficos também tem um leitor de tela nativo.

O GNOME também permite um teclado visual na tela, de forma que o usuário pode orientar a
digitação com o mouse, com o movimento dos olhos ou joysticks especializados.

Alguns aplicativos implementam acessibilidade de forma própria, como o emacspeak, uma


versão “vocalizada” do emacs e o Firevox que é uma versão do Firefox que vem com um
leitor de tela dedicado integrado.

O projeto Easystroke também possibilita o reconhecimento de gestos com o Mouse.

O projeto Simon permite o reconhecimento de comandos por voz.

Alguns recursos ainda são possíveis quando se trata de acessibilidade, tais como:

Emular o mouse com o teclado numérico;


Especificar a duração da pressão nas teclas até que o sistema aceite o que foi
digitado;
Ignorar o aperto rápido ou repetido de teclas;
Aceitar a combinação de teclas em sequência ao invés de em conjunto;
Emitir avisos sonoros quando alguma tecla especial for pressionada.
Ignorar a repetição quando uma tecla for apertada por um longo tempo.

Alguns sites sobre acessibilidade podem ser pesquisados:

KDE Accessibility Project: http://accessibility.kde.org/


GNOME Accessibility Project: http://developer.gnome.org/projects/gap/
KDE Usability Project: http://usability.kde.org/
GNOME Usability Project: http://developer.gnome.org/projects/gup/

Os leitores de tela mais comuns são:

Emacspeak: é um excelente leitor não gráfico para modo texto para usuários com
pouca ou nenhuma visão. http://www.cs.cornell.edu/home/raman/emacspeak/
Jupiter Speech System: também é um leitor de tela para modo texto.
http://www.eklhad.net/linux/jupiter
372 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

Screader: outro leitor de tela e sintetizador de voz para modo texto.


http://www.euronet.nl/~acj/eng-screader.html
Speakup: outro leitor de tela que requer um hardware específico de sintetizador de
voz. http://www.linux-speakup.org
ZipSpeak: é uma minidistribuição de Linux com sintetizador de voz.
http://www.linux-speakup.org/zipspeak.html

Os ampliadores de tela mais comuns são:

GMag: é um ampliador de tela para o X Window. http://projects.prosa.it/gmag/


Puff: é um ampliador de tela para o X Window.
http://trace.wisc.edu/world/computer_access/unix/unixshare.html
Xzoom: é um ampliador de tela para o X Window.
http://filewatcher.org/sec/xzoom.html

No X Window existe ainda uma aplicação chamada AccessX que permite alterar a
configuração do teclado do terminal para melhorar a acessibilidade. São elas:

StickyKeys: permite ao usuário travar as teclas modificadoras de funções (como


control, alt, shift) de como que operações com mais de uma tecla podem ser feitas
com apenas um dedo ao invés de vários dedos;
MouseKeys: permite alternativas de teclado e mouse no movimento de cursor e
operações com mouse;
SlowKeys: permite que uma tecla deve ser pressionada por mais tempo para que seja
válida, evitando que as teclas sejam pressionadas por acidente;
ToggleKeys: emite um sinal de áudio que alerta o usuário quando uma determinada
tecla é pressionada, como Caps Lock ou Num Lock;
RepeatKeys: permite que um usuário com coordenação motora limitada tenha mais
tempo para soltar as teclas antes que sequencias de múltiplas teclas possam ser
enviadas para a aplicação;
BouceKeys: permite que se determine um intervalo mínimo entre os toques das
teclas de forma a prevenir toques não intencionais no teclado.

Na prova você deve ser capaz de associar o recurso de acessibilidade ao benefício que ele
propõe aos usuários.

Já dizia o Mestre: "sois o sal da Terra". Basta um Gandhi,


uma Madre Teresa, um Mandela, um Luther King Jr, um Freud,
um Einstein para mudar tudo. -- Uirá Ribeiro

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 373


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

374 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Segurança

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 375


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

376 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Eu gosto do impossível porque lá


a concorrência é menor.
-- Walt Disney

Simulado
3.1 Aplique as permissões de Usuário
e Propriedade

Como o Linux é um sistema operacional multiusuário, as permissões de acesso a arquivos,


diretório e outros dispositivos são necessárias para garantir que os usuários tenham acesso
somente aos recursos para os quais eles podem utilizar.

Estes recursos podem ser desde um simples arquivo até uma impressora ou um gravador de
CD-ROM.

Cada arquivo no Linux tem definido o seu controle de acesso. Este controle é definido por
três classes:

Permissões de usuário: Definem a permissão para o usuário que é o “dono” do


arquivo, quem o criou e o mantém;
Permissões de grupo: Definem a permissão para o grupo de usuários ao qual o
arquivo pertence;
Permissões para outros usuários: Definem a permissão para todos os outros
usuários (não dono e não faz parte do grupo grupo).

Figura 38 - Classes de Permissões

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 377


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

E para cada classe podemos definir três tipos de acesso: leitura (r), escrita (w) e execução
(x). Quando não há o acesso para aquele determinado tipo, o sistema sinaliza com um traço
"-".

As trê s primeiras posições da esquerda representam as permissõ es para o usuá rio dono do
arquivo. Quem cria o arquivo é seu dono.

As trê s outras representam as permissõ es relativas a um grupo (pode ser que o usuá rio dono
pertença ao grupo ou nã o).

As três últimas permissões representa os outros (que nã o é o usuá rio dono do recurso e nã o
pertence ao grupo).

Então, ao tentar acessar um recurso, ou você é o dono do arquivio, ou faz parte do grupo a
qual o arquivo pertence, ou você é "os outros".

Como no Linux tudo é um arquivo, isto facilita muito trabalhar com as permissões, já que o
esquema é o mesmo para tudo. Não importa se você está falando de um arquivo, diretório,
ou recurso de hardware.

Esta divisão cobre praticamente todas as necessidades em termos de segurança.

A opção "-l" do comando ls mostra as permissões dos arquivos:

Figura 39 - ls

Os arquivos podem ser classificados pelo seu tipo:

(-) Arquivo comum


(d) Diretório
(b) Dispositivo de Bloco
(c) Dispositivo de Caractere
(s) Socket

378 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

(p) Pipe (condutores)


(l) Link Simbólico

A primeira letra que aparece na esquerda do "ls -l" indica o tipo de arquivo. Quando não há
letra, mas um traço, o arquivo é comum.

O número logo após as permissões indicam para arquivos comuns a quantidade de links
físicos que ele tem. Como há pelo menos um link físico que é o próprio nome do arquivo, a
contagem começará em 1.

Para diretórios, a contagem é 2+N, onde N é o número de arquivos na raiz do diretório;

Veja as permissões de alguns arquivos:

-rwxrwxr-x 1 uira users 333 set 11 10:46 backup.sh


drwxrwxr-x 4 carla users 4096 mai 7 2016 funnel

No caso do arquivo backup.sh:

É um arquivo comum, pois seu tipo é um traço "-";


Existe apenas 1 link físico para ele (1);
Tem permissões de leitura, gravação e execução (rwx) para o Dono;
Tem permissões de leitura, gravação e execução (rwx) para o Grupo;
Permissões de leitura e execução (r-x) para Outros;
Seu dono é o usuário uira;
Faz parte do grupo users;
Tem 333 bytes;
Foi alterado pela última vez em 11 de setembro às 10:46.

No caso do arquivo funnel:

É um diretório, pois seu tipo é "d";


Existem 2 arquivos no diretório (2+2);
Tem permissões de leitura, gravação e execução (rwx) para o Dono;
Tem permissões de leitura, gravação e execução (rwx) para o Grupo;
Permissões de leitura e execução (r-x) para Outros;
Seu dono é o usuário carla;
Faz parte do grupo users;
Tem 4096 bytes;
Foi alterado pela última vez em 7 de maio de 2016

As definições de leitura, escrita e execução tê m nuances diferentes para arquivos e


diretó rios. Veja o quadro a seguir:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 379


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Objeto Leitura (r) Escrita (w) Execução (x)

Arquivo Permite ler o conteúdo Permite alterar o conteúdo Permite executar o arquivo como um
do arquivo. do arquivo. programa

Diretório Permite listar o Permite criar, mover, Permite ler e gravar arquivos no
conteúdo do diretório. renomear e apagar arquivos diretório, bem como mudar o
no diretório. diretório corrente para o diretório
com "cd".

As permissões são gravadas em forma binária, com 12 bits para cada arquivo no sistema,
conforme a figura a seguir:

Figura 40 - Bits de Permissões

Os três primeiros bits da esquerda para a direita são bits de atributos especiais, a saber:

SUID (Set User ID): O bit de SUID afeta somente os arquivos executáveis. Normalmente os
programas são executados com a permissão do usuário que os executou. O SUID muda esta
condição, fazendo com que o programa seja executado sob as permissões do usuário Dono
do arquivo, não importando quem o chamou. O SUID geralmente é utilizado para dar a um
programa permissões de root. É preciso que o administrador tenha muito cuidado ao utilizar
o SUID, pois um programa mal- intencionado pode ter acesso elevado ao sistema;

SGID (Set Group ID): O bit de SGID funciona como o bit SUID. Ele faz com que os
programas executem sob a permissão de grupo do dono do arquivo. Se aplicado em um
diretório, o SGID vai fazer com que todos os arquivos criados debaixo deste diretório tenham
o mesmo grupo do diretório;

Sticky (Colado na memória): O bit especial chamado de sticky ou bit de colado na


memória originalmente fazia com que os programas permaneçam na memória mesmo depois
de terminados. Isto fazia com que os programas executem mais rapidamente da próxima vez
que forem chamados. Este bit quando aplicado em diretórios faz com que somente o dono do
diretório, o dono do arquivo ou o root possam renomear ou apagar arquivos neste diretório.

Nas implementações recentes no Linux e Unix este bit já não é mais usado para “colar na
380 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

memória”, mas para evitar que arquivos que o tenham habilitado de serem apagados por
usuários que não sejam seu dono. Se habilitado em um diretório este bit confere que seu
conteúdo possa somente ser apagado pelos respectivos donos dos arquivos nele contidos, o
próprio dono do diretório ou o root.

Logicamente, o administrador não precisa escrever as permissões em 12 bits. Desta forma,


as permissões podem ser representadas por letras ou em octetos conforme a tabela a seguir:

Octal Binário Letras Descrição

0 000 — Sem acesso

1 001 —x Somente Execução

2 010 -w- Somente Escrita

3 011 -wr Somente Escrita e Execução

4 100 r— Somente Leitura

5 101 r-x Somente Leitura e Execução

6 110 rw- Somente Leitura e Escrita

7 111 rwx Leitura, Escrita e Execução

Esta representação pode ser utilizada para cada classe (Dono, Grupo e Outros), bem como
para os bits especiais (SUID, SGID, Sticky).

Exemplo:

rwxr-x--- root users Script.sh

No exemplo, o arquivo Script.sh tem permissões de leitura, gravação e execução para o


usuário root, permissões de leitura e execução para o grupo users e nenhuma permissão
para outros usuários que não sejam do grupo users.

As permissões do arquivo Script.sh podem ser representadas pelos octetos 750, sendo 7 para
as permissões do dono do arquivo (rwx), 5 para as permissões do Grupo (r-x) e 0 para as
permissões de Outros (—).

Como os bits de permissão especiais são utilizados com pouca frequência, e sob condições
especiais, eles são representados pela letra (s) no lugar do (x) de execução para os bits SUID
e SGID nas classes de Dono do arquivo e Grupo, e (t) no lugar do (x) para o bit sticky na
classe de Outros.

Veja o Exemplo:

rwsr-x--- root users Firewall

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 381


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

O arquivo Firewall tem permissão de leitura, escrita e execução para o usuário root, leitura e
execução para usuários do grupo users e nenhuma permissão como Outros.

E ainda possui o bit de SUID habilitado (o "s" no lugar de "x" para o Dono do arquivo).

Desta forma, o programa Firewall tem poderes de superusuário quando executado, já que o
seu dono é o root. As permissões dele também podem ser representadas pelo octeto 4750.

Você não precisa decorar a tabela de permissões.

Basta decorar que as permissões de Leitura tem sempre o valor 4.

As permissões de Gravação tem sempre o valor 2 e as permissões de execução sempre o


valor 1.

As três classes de permissões (Dono, Grupo e Outros) são representadas por 3 números.

Se você decompor cada número, vai encontrar as permissões de cada classe. Veja a figura a
seguir:

Figura 41 - Permissões em Octetos

382 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

umask
$ umask [modo]

Quando novos arquivos são criados no sistema, eles são criados com permissões definidas
gravadas no perfil de cada usuário e configuradas pelo comando umask.

Criando novos arquivos


O comando umask mostra a máscara das permissões quando os arquivos são criados e
aceita como argumento um número inteiro de três dígitos para configurar as permissões.

No Linux, as permissões padrão para criação de arquivos e diretórios para todos os usuários
são 666 (rw-rw-rw) e 777 (drwxrwxrwx) respectivamente.

Através do comando umask as permissões de criação dos arquivos e diretórios são alteradas
tomando como base as permissões padrão.

Como o umask recebe como argumento um número inteiro de três dígitos, cada dígito
representa uma máscara para as permissões de Dono dos Arquivos, Grupo e Outros na
mesma ordem.

Depois de definida a máscara de criação dos arquivos, ela deve ser subtraída das permissões
padrão:

Por exemplo:

$ umask 27

O número 27 deverá ser lido como 027, e define os bits da máscara como 000 para Dono do
Arquivo, 010 para Grupo e 111 para Outros.

Como o umask define uma máscara, o seu entendimento fica mais fácil fazendo essa
analogia.

Uma máscara esconde parte do rosto, deixando transparecer somente aquilo que desejamos
mostrar.

Se estamos a criar um arquivo, o "rosto" será sempre definido por "666", que são as
permissões rw-rw-rw. Se aplicarmos neste rosto a máscara 027, o 0 não esconde o primeiro
6, o 2 esconde parte do segundo 6, deixando aparecer só um 4, e o 7 esconde todo o último
6, não deixando aparecer nada. Desta forma, os arquivos criados com a máscara 027 terão a
permissão 640 (rw-r-----).

Veja o exemplo ao se criar um arquivo com a máscara configurada para 027:

$ umask 027

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 383


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

$ umask
0027
$ touch arquivo
$ ls -l arquivo
-rw-r-----. 1 uira uira 0 Set 18 10:50 arquivo

O arquivo terá as permissões resultantes da aplicação da máscara (666 -027) = 640.

O mesmo raciocínio vale quando se cria diretórios. Mas neste caso, o "rosto" sempre será
"777". Então uma máscara 027 quando aplicada ao se criar um diretório, o 0 não irá
esconder o primeiro 7, o 2 irá esconder parte do 7, deixando aparecer um 5, e o 7 irá
esconder todo o último 7 do rosto. Veja o exemplo:

$ mkdir diretorio
$ ls -l
drwxr-x---. 2 uira uira 6 Set 18 11:01 diretorio

Deste forma, o diretório criado com a máscara 027 terá permissão 750.

É muito importante dizer que o comando umask é configurado em algum script de carga do
sistema, geralmente no arquivo /etc/profile.

O usuário pode mudar a máscara quando desejar com o comando umask, mas que será
válida somente naquela sessão do shell, a menos que o usuário altere o valor do umask no
script de carga do sistema.

Vamos ver agora os comandos que gerenciam as permissões, propriedade e grupos.

Modificando as Permissões de Arquivos

O comando utilizado para modificar as permissões de arquivos é o chmod. Este comando


aceita a representação das permissões através de letras ou octetos.

chmod
$ chmod [opções] { letras, octal } arquivo

O comando chmod serve para alterar as permissões de arquivos e diretórios.

Ele aceita como parâmetro das permissões:

Octetos: representando as três classes: 777, 750, 640, etc.


Letras: As letras u para usuáro dono, g para grupo e o para outros para representar

384 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

as classes, seguido de símbolos de adição (+), subtração (-) e igualdade (=) para as
operações, e as letras r, w, x, X, s e t.

O esquema de configurar as permissões por octetos é mais simples, pois se usa apenas três
números para configurar as permissões.

Para utilizar letras para configurar as permissões, veja a Tabela Letras para Representar as
Classes:

Letra Descrição

u Dono do Arquivo (Usuário)

g Grupo

o Outros

a Todos

Deve usar um operador, para adicionar, subtrair ou igualdade para configurar as permissões
exatas:

Símbolo Descrição

+ Adicionar uma permissão, sem alterar as demais

- Subtrair uma permissão, sem alterar as demais

= Configurar as permissões com exatidão

E por fim, as permissões podem ser representadas pelas letras que você já conhece (rwx),
adicionando o X, s e t:

Permissão Descrição

r Leitura (Read)

w Gravação (Write)

x Execução (eXecute)

X Configura o bit de execução para outras classes para arquivos que já possuem o bit (x)

s SUID ou SGID

t Sticky

O comando chmod pode ser utilizado com as seguintes opções:

-v: Reporta as permissões dos arquivos, inclusive as permissões alteradas;


-c: Reporta somente as permissões que foram alteradas;
-R: Muda as permissões de todos os arquivos e diretórios recursivamente dentro da

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 385


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

mesma hierarquia.

Exemplos de mudança de permissões:

$ chmod 755 Leiame.txt

Muda as permissões do arquivo Leiame.txt para rwx (7) para o Usuário, r-x (5) para o Grupo e
r-x (5) para Outros.

A mesma permissão poderia ser configurada como:

$ chmod u=rwx,go=rx Leiame.txt

Neste exemplo, usou-se o símbolo = para igualar as permissões as letras indicadas.

Para colocar permissões de execução num arquivo, pode-se simplesmente adicionar a


permissão de execução. Como nenhuma classe foi informada, ele irá adicionar as permissões
de execução para todas as classes:

$ chmod +x Backup.sh

Se quisermos adicionar permissões de escrita para o grupo do arquivo, pode-se adicionar a


permissão de escrita:

$ chmod g+w arquivo.txt

Dessa forma o grupo a que pertence este arquivo passa a ter permissão de gravação no
mesmo.

É possível mudar mais de uma permissão ao mesmo tempo, bastando indicar as letras das
permissões (rw):

$ chmod o+rw contabilidade

Também é possível mudar permissões de uma só vez para diversas classes. Neste exemplo
as permissões de escrita e execução são retiradas de todas as classes:

$ chmod ugo-wx arquivosomenteleitura

Fique atento as permissões que usam os operadores de adição (+) e subtração (-), pois eles
adicionam ou subtraem permissões, alterando as permissões que já existem para o arquivo.
Já o operador de igualdade (=) coloca as permissões exatamente como indicado.

386 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Aos usuários comuns, o chmod somente permite que o dono do arquivo ou diretório altere as
suas permissões. Já o root pode alterar as permissões de qualquer arquivo ou diretório.

Deve-se ter muito cuidado ao alterar as permissões dos arquivos e diretórios, pois
permissões mal configuradas é um prato cheio para malwares e invasores.

Alterando o Dono dos Arquivos e


Grupos

Os comandos chown e chgrp alteram o dono dos arquivos e diretórios assim como o grupo ao
qual o arquivo pertence.

chown
$ chown [opções] usuário.grupo arquivo

O comando chown altera o dono do arquivo e pode também alterar o grupo a que este
arquivo pertence.

Ele permite as seguintes opções:

-v: Reporta o dono dos arquivos, inclusive as mudanças de dono;


-c: Reporta somente a mudança de dono;
-R: Muda o dono de todos os arquivos e diretórios recursivamente dentro da mesma
hierarquia.

O comando chown pode receber como parâmetro:

Login
Se somente for informado o login do usuário, a propriedade do Dono do arquivo muda,
mas a propriedade do grupo permanece inalterada.
Login:grupo
Se for informado um "login:grupo" ou "login.grupo", tanto a propriedade do dono do
arquivo quanto o grupo são alterados.
Login:
Se for informado um "login:" ou "login." sem informar o grupo, o dono do arquivo é
alterado, e o grupo é alterado para o grupo em que o login indicado faz parte.
:grupo
Se for informado ":grupo" ou ".grupo" sem informar o login, o chown vai agir como o
comando chgrp, alterando somente o grupo do arquivo.

Exemplos:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 387


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Altera o dono do arquivo Leiame.txt para o usuário uira:

$ chown uira Leiame.txt

Altera o dono do arquivo Leiame.txt para o usuário uira e o grupo do arquivo para o grupo do
usuário:

$ chown uira. Leiame.txt

Altera o dono do arquivo Leiame.txt para o usuário uira e o grupo para users:

$ chown uira:users Leiame.txt

Altera o grupo do arquivo para users e deixa inalterado o dono do arquivo:

$ chown .users Leiame.txt

Altera o dono de todos os arquivos e diretórios dentro de /home/uira para o usuário uira:

$ chown –R uira /home/uira

Um usuário comum somente pode passar a propriedade de arquivos e diretórios dos quais
ele é dono. O usuário root pode alterar a propriedade de qualquer arquivo ou diretório.

chgrp
$ chgrp [opções] grupo arquivo

O comando chgrp altera o grupo dos arquivos e diretórios.

Pode ser utilizado com as seguintes opções:

-v: Reporta o grupo dos arquivos, inclusive as mudanças de grupo;


-c: Reporta somente a mudança de grupo;
-R: Muda o grupo de todos os arquivos e diretórios recursivamente dentro da mesma
hierarquia.

Exemplo:

$ chgrp –R users /home

388 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Altera recursivamente o grupo de todos os arquivos e diretórios dentro de /home para users.

Controle de Listas de Acesso - ACLs

As Listas de Controle de Acesso (ACL) são uma opção avançada de segurança que permitem
um controle mais refinado dos direitos de acesso aos arquivos e diretórios no Linux.

As ACLs permitem, por exemplo, que um arquivo tenha permissões para diferentes usuários,
além do tradicional "dono do arquivo", "grupo" e "outros".

Este tipo de controle refinado exige um processamento maior do sistema ao lidar com os
arquivos.

Não é recomendado que se habilite as ACLs em arquivos do sistema, uma vez que as
permissões tradicionais do Linux são mais que suficientes para o controle destes arquivos.

Assim, indica-se o uso de ACLs somente em casos específicos, em que se deseje um controle
maior no acesso aos arquivos, e que este recurso esteja habilitada numa partição separada
para esse propósito específico.

Para que o controle das listas de acesso funcione, é necessário montar a partição com a
opção "acl" habilitada. Os sistemas de arquivo ext2, ext3, ext4 e btrfs oferecem suporte
ao acl.

Algumas partições se montadas com a opção "defaults" no arquivo /etc/fstab, podem ter o
"acl" habilitado como padrão. Também é possível incluir a opção "acl" nas opções de
montagem das partições de forma explicita no arquivo fstab.

Para conferir se a partição tem a opção de ACL habilitada como padrão, pode-se usar o
comando tune2fs:

# tune2fs -l /dev/xvdg | grep "Default mount options:"


Default mount options: user_xattr acl

Uma ACL é composta por regras de acesso (access ACLs) e regras padrão (default ACLs).

Uma regra de acesso especifica informações para um único arquivo ou diretório. Um arquivo
ou diretório pode ter várias regras de acesso, concedendo ou retirando direitos de vários
usuários ou grupos de usuários.

As regras padrão são aplicadas apenas em diretórios, e especificam qual será o acesso
padrão para todos os arquivos contidos no diretório que não possuam uma regra de acesso
aplicada.

Os comandos para lidar com ACLs são getfacl e setfacl.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 389


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

getfacl
$ getfacl [opções] arquivo

O comando getfacl pode ser usado para mostrar as propriedades dos arquivos, tais como o
seu proprietário, o grupo ao qual pertence e o Access Control List (ACL).

Exemplos:

Se não há nenhuma ACL aplicada ao arquivo, o comando getfacl mostrará as permissões


padrão do Linux:

$ getfacl list
# file: list
# owner: uiraribeiro
# group: uiraribeiro
user::rw-
group::rw-
other::r--

Uma ACL pode ser configurada para o arquivo list com o comando setfacl:

$ setfacl -m u:arthur:r list

Neste exemplo, foi criada uma ACL concedendo acesso de leitura para o usuário Arthur.

Uma segunda ACL pode ser criada para o mesmo arquivo, concedendo outra permissão para
outro usuário:

$ setfacl -m u:carla:rw list

Agora que o arquivo tem regras de controle de acesso, o comando getfacl mostra as regras
para cada usuário, bem como as permissões padrão do Linux:

$ getfacl list
# file: list
# owner: uiraribeiro
# group: uiraribeiro
user::rw-
user:arthur:r--
user:carla:rw-

390 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

group::rw-
mask::rw-
other::r--

Toda a vez que um arquivo ou diretório estiver com ACLs aplicadas, o símbolo "+" estará
presente para se indicar que existem ACLs.

Veja o exemplo ao se listar o arquivo list com o comando "ls -l":

$ ls -l list
-rwxrw-r--+ 1 uiraribeiro uiraribeiro 43 Dec 27 11:47 list

setfacl
$ setfacl [opções] ugo:nome:permissões arquivos

O comando setfacl pode ser utilizado para criar ou remover uma regra de lista de controle de
acesso em uma partição que tenha as ACLs habilitadas.

Se o sistema de arquivos não suportar ou não estiver com o ACL habilitado, o comando
setfacl irá alterar as permissões padrão do Linux.

Para Criar uma Regra ACL

Para criar uma regra de acesso para um arquivo ou diretório, utiliza-se a opção "-m" do
setfacl.

Logo a seguir é necessário dizer se a regra irá se aplicar a um usuário (u), ao grupo (g) ou
então ao outros (o), especificando a letra correspondente.

Em seguida, deve-se declarar o nome do usuário (UID), ou do grupo (GUID), segundo da


permissão desejada, utilizando-se o seguinte formato:

Para regras de usuário:

$ setfacl -m u:uid:permissões arquivo

Exemplo:

$ setfacl -m u:uiraribeiro:rwx arquivo

Também é possível usar a palavra "user:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 391


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

$ setfacl -m user:uiraribeiro:rwx arquivo

Se o UID do usuário for omitido, o setfacl criará uma regra para o proprietário do arquivo:

$ setfacl -m user::rwx arquivo

Para criar uma regra de grupo, utiliza-se a letra "g" ou "group", seguido do GUID:

$ setfacl g:postfix:rw arquivo

ou

$ setfacl group:postfix:rw arquivo

Para criar uma regra para Outros, não é necessário declarar o UID e GUID. A letra será o "o"
seguindo das permissões:

$ setfacl o::r arquivo

Para Criar uma Regra Padrão

Uma regra padrão é aplicável somente em diretórios, e define qual serão as regras de todos
os arquivos e diretórios criados dentro do diretório que contém a regra padrão.

A regra padrão só é aplicável para os arquivos criados a partir do momento que a regra
padrão foi aplicada no diretório. Os arquivos ou diretórios que lá existirem não terão a regra
padrão aplicada sobre eles.

Também um arquivo copiado para um diretório que tenha uma regra padrão não terá a regra
padrão do diretório destino aplicada a ele. A regra padrão só se aplica para arquivos e
diretórios criados.

A opção "-dm" deve ser usada para criar a regra padrão:

$ setfacl -dm u:uiraribeiro:rw teste

Verificando a ACL do diretório teste:

$ getfacl teste
# file: teste/
# owner: uiraribeiro
# group: uiraribeiro

392 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

user::rwx
group::rwx
other::r-x
default:user::rwx
default:user:uiraribeiro:rw-
default:group::rwx
default:mask::rwx
default:other::r-x

Neste exemplo, o diretório teste já tinha um arquivo chamado hello.c, que não herdou as
permissões de ACL padrão do diretório teste:

$ getfacl teste/hello.c
# file: teste/hello.c
# owner: uiraribeiro
# group: uiraribeiro
user::rw-
group::rw-
other::r--

Se criarmos um arquivo no diretório teste, este arquivo herdará as regras padrão do


diretório:

$ cd teste
$ gcc hello.c -o hello

Se verificarmos as regras do arquivo hello recém criado pelo compilador gcc, veremos que
ele tem as regras do diretório teste:

$ getfacl hello
# file: hello
# owner: uiraribeiro
# group: uiraribeiro
user::rwx
user:uiraribeiro:rw-
group::rwx
mask::rwx
other::r-x

É possível utilizar a opção "-M" do setfacl para especificar um arquivo que contenha uma
lista de regras que devem ser aplicadas:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 393


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

$ cat acls.txt
u:uiraribeiro:rw
u:arthur:r
u:carla:rw

$ setfacl -M acls.txt arquivo

Desta forma, as regras no arquivo acls.txt serão aplicadas ao arquivo desejado.

Também é possível aplicar as regras recursivamente em todos os arquivos e subdiretórios


utilizando a opção "-R":

$ setfacl -R -M acls.txt diretorio

Para Excluir uma Regra Específica

Para excluir uma regra específica, deve-se usar a opção "-x" do setfacl, especificando qual é
a regra a ser excluída:

$ setfacl -x u:uiraribeiro hello

Se consultarmos novamente o arquivo hello, veremos que a regra foi removida:

$ getfacl hello
# file: hello
# owner: uiraribeiro
# group: uiraribeiro
user::rwx
group::rwx
mask::rwx
other::r-x

Também é possível utilizar a opção "-X" do setfacls para especificar um arquivo com uma
lista de regras que devem ser removidas:

$ setfacl -X acls.txt arquivo

Para excluir todas as regras

Para excluir todas as regras padrão de um diretório, deve-se usar a opção "-k":

$ setfacl -k teste
394 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

E para excluir todas as regras, pode-se usar a opção "-b":

$ setfacl -b list

Permissões de Contexto

A permissão padrão do Linux (dono, grupo e outros) e as Listas de Controle de Acesso (ACLs)
são chamadas de métodos de Controle de Acesso Discricionário (DAC). O termo discricionário
quer dizer "livre de restrições".

Isto significa que a permissão é definida a critério do proprietário do arquivo ou diretório. Não
há nada que um administrador possa fazer para impedir que os usuários concedam
permissão total a outros usuários nos seus diretórios, utilizando o método DAC.

No entanto, o Linux pode fornecer uma proteção extra, com o método de Controle de Acesso
Mandatório (MAC). O termo mandatório quer dizer que o usuário não tem opção.

Os métodos MAC permitem que o administrador do sistema defina a segurança com base no
contexto de um objeto no sistema Linux para substituir permissões definidas pelos
proprietários de arquivos e diretórios.

Os métodos MAC fornecem regras para que os administradores restrinjam o acesso a


arquivos e diretórios não apenas aos usuários, mas também aos aplicativos em execução no
sistema.

Há duas implementações populares do método MAC para o Linux: SELinux para sistemas
baseados no Red Hat, e AppArmor para sistemas baseados no Ubuntu.

SELinux

O Security-Enhanced Linux, carinhosamente chamado de SELinux é um projeto desenvolvido


pela agencia americana NSA para implementar a segurança do tipo MAC para o Linux.

O SELinux foi incorporado nas distribuições baseadas em RedHat, tais como o Fedora e
CentOS, e instalada opcionalmente em sistemas baseados no Debian.

A implementação da segurança MAC no SELinux é feita através de políticas que controlam o


acesso entre vários tipos de objetos no Linux, incluindo contas de usuários, arquivos,
diretórios, dispositivos, memória, rede e processos em execução.

Desta forma, toda vez que um usuário ou programa tenta acessar um objeto no sistema, o
SELinux intercepta e verifica se está ou não de acordo com as políticas de acesso definidas.

O SELinux funciona como o Serviço Secreto do Linux. Qualquer coisa que tenha a ver com a
"casa branca", eles precisam verificar primeiro.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 395


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

O arquivo de configuração /etc/selinux/config controla a operação básica do SELinux. As


variáveis SELINUX e SELINUXTYPE definem como o SElinux irá trabalhar:

$ cat /etc/selinux/config
SELINUX=disabled
SELINUXTYPE=targeted

Há três possibilidades de funcionamento do SELinux, definidas pela variável SELINUX:

enforcing - Com esta opção o SELinux está habilitado, e não irá permitir acessos que
violem as políticas definidas;
permissive - Com esta opção o SELinux apenas fará o registro em LOG das
violações, sem restringir o acesso. É ideal para se testar as políticas do SELinux antes
de colocá-las em funcionamento;
disabled - Desabilita o SELinux.

Uma vez habilitado com enforcing ou permissive, o SELinux pode trabalhar com as
políticas de acesso definidas pela variável SELINUXTYPE:

targeted - Opção padrão, que atua nas políticas de processos de rede;


minimum - opção que atua nas políticas modificadas de processos de rede, com
mínimo de processos;
mls - Multi Level Security. Esta opção é utilizada em políticas de proteção avançadas,
requeridas pelas agências americanas, que classifica a informação como "top secret",
"não classificada" e "pública".

Se a variável SELINUX no arquivo /etc/selinux/config estiver como disabled, você não


conseguirá habilitar o SELinux enquanto não alterar esta variável para enforcing ou
permissive.

Recomenda-se fortemente que ao habilitar o SELinux pela primeira vez, utilizar o modo
permissive, uma vez que algum problema de configuração com as políticas do SELinux pode
impedir o computador de reiniciar.

Depois de alterar o arquivo /etc/selinux/config, é necessário reiniciar o sistema.

Depois de reiniciar, pode-se usar o comando setenforce para habilitar de fato o SELinux.

setenforce

O comando setenforce pode ser utilizado para alternar os modos do SELinux entre enforcing
ou permissive. Ele aceita os parâmetros Enforcing ou Permisive, que podem ser
representados por 1 e 0, respectivamente.

# setenforce [ Enforcing | Permissive | 1 | 0 ]

Para desabilitar o SELinux, é necessário alterar o arquivo /etc/selinux/config, e colocar o


valor disabled na variável SELINUX.
396 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

getenforce

O comando getenforce retorna qual é o status do SELinux:

$ getenforce
Enforcing

sestatus

O comando sestatus retorna mais informações do SELinux:

$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Memory protection checking: actual (secure)
Max kernel policy version: 31

Uma vez que o SELinux está habilitado no modo enforcing ou permissive, é possível aplicar
as políticas do SELinux.

Políticas do SELinux
Criar novas políticas no SELinux é algo complexo, e desnecessário, a menos que você tenha
um propósito bem definido para fazer isso.

Felizmente, o SELinux vem com um conjunto grande de políticas pré-configuradas, que


podem ser habilitadas e desabilitadas a gosto do administrador do sistema.

O SELinux define as políticas de segurança aplicando etiquetas de contexto de segurança


para todos os objetos do Linux.

Um contexto de segurança tem os seguintes atributos:

usuário:regra:tipo:nível

Os atributos usuário e a regra somente são usados quando o SELinux usa a política Multi
Level Security (mls), definida no arquivo /etc/selinux/config pela variável SELINUXTYPE.
Raramente é necessário definir este nível de política, a menos que você trabalhe em uma
agência governamental dos EUA.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 397


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

No modo de política padrão targeted, o SELinux somente usa o atributo tipo para atribuir o
tipo de segurança do objeto e controlar o acesso baseado nisso.

O atributo nível configura o nível de sensibilidade de segurança e o nível de liberação. Este


atributo é opcional, e usando somente em ambientes de alta segurança.

No modo de segurança targeted, cada política define quais são os objetos de um tipo de
contexto de segurança específico podem acessar objetos de outro tipo de contexto de
segurança.

Por exemplo, um aplicativo rotulado com o tipo contexto de segurança sendmail_t só tem
permissão para acessar arquivos rotulados com o contexto de segurança de tipo
sendmail_t. Isso restringe o acesso do aplicativo a apenas determinados arquivos no
sistema.

Desta forma, é possível, por exemplo, enjaular um Servidor Web Apache com acesso
somente aos arquivos da pasta /var/www/htdocs.

O SELinux mantém políticas em arquivos de texto no diretório /etc/selinux. Assim, todas as


políticas para o modo de segurança targeted estão no diretório /etc/selinux/targeted.

Grupos de Políticas (Módulos)

Para facilitar a adminsitração das políticas, o SELinux inclui alguns grupos de políticas, que
são agrupadas em módulos, que podem ser instaladas e desinstaladas com o comando
semodule.

A opção "-l" do comando semodule lista os módulos instalados:

# semodule -l
abrt
accountsd
acct
afs
aiccu
aide
ajaxterm

Interruptores

O SELinux permite que políticas sejam habilitadas e desabilitadas facilmente como


interruptores.

O comando getsebool mostra o status de uma política:

# getsebool -a | grep " on"


cron_userdomain_transition --> on

398 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

httpd_builtin_scripting --> on
httpd_enable_cgi --> on
( ... )

Para alterar o status de uma política, pode-se ligar ou desligar o interruptor com o comando
setsebool seguindo do nome da política e qual opção se deseja: on ou off:

$ setsebool httpd_builtin_scripting off

Visualizar o Contexto de Segurança


Para ver o contexto de segurança aplicado aos objetos, basta adicionar a opção "-Z" aos
comandos id, ls, ps e netstat. Cada um destes comandos operam objetos diferentes.

Para ver o contexto de segurança de um usuário:

$ id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

O contexto unconfined_u significa que a conta de usuário não está designada a nenhum
contexto. O unconfined_r significa que nenhuma regra está aplicada e unconfined_t
determina o tipo.

Para ver o contexto de segurança de um arquivo:

$ ls -Z arquivo
unconfined_u:object_r:user_home_t:s0 arquivo

Novamente, nenhum contexto está aplicado ao arquivo, e o tipo user_home_t define o


acesso aos arquivos dos diretórios HOME dos usuários.

Para ver o contexto de segurança dos processos:

$ ps axZ | grep sshd


unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 4053 ? S
0:00 sshd: parallels@pts/1

Nenhum contexto, regra ou tipo está aplicado ao processo de sshd.

O SELinux também protege as portas TCP/UDP do sistema baseado em políticas. O comando


semanage pode mostrar quais são as portas habilitadas por política:

# semanage port -l | grep http

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 399


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

http_cache_port_t tcp 8080, 8118, 8123,


10001-10010
http_cache_port_t udp 3130
http_port_t tcp 80, 81, 443, 488, 8008,
8009, 8443, 9000
pegasus_http_port_t tcp 5988
pegasus_https_port_t tcp 5989

Neste exemplo, as portas 80, 81, 443, 488, 8008, 8009, 8443, 9000 estão habilitadas para o
servidores web.

Alterando o Contexto de Segurança


Para alterar o contexto de segurança de arquivos e diretórios, o comando chcon pode ser
usado.

Exemplo:

$ chcon -u usuário -r regra -t tipo arquivo

Por exemplo, pode-se querer alterar a etiqueta dos arquivos que o Servidor Web Apache
pode acessar.

O primeiro passo é verificar a etiqueta da pasta /var/www/htdocs com o comando "ls -Z":

$ ls -lZ /var/www
drwxr-xr-x. 2 root root
system_u:object_r:httpd_sys_script_exec_t:s0 4096 May 2 2019
cgi-bin
drwxr-xr-x. 2 root root system_u:object_r:httpd_sys_content_t:s0
4096 May 2 2019 html

Agora, utilizando o comando chcon, pode-se alterar o contexto dos arquivos que o servidor
web pode acessar. A opção "-R" troca o contexto recursivamente.

# chcon -R -t httpd_sys_content_t /var/www/htdocs

O comando restorecon pode ser utilizado para restaurar o contexto de arquivos e diretórios
ao contexto original.

O comando semanage pode ser utilizado para adicionar uma porta em uma determinada
política:

400 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

# semanage port -a -t http_port_t -p tcp 8081

Pode-se conferir a porta com o comando "semanage port -l":

# semanage port -l | grep http_port_t


http_port_t tcp 8081, 80, 81, 443, 488, 8008, 8009, 8443, 9000

AppArmor

O AppArmor é a implementação padrão do método MAC para distribuições baseadas no


Debian.

Ele não é tão complexo e completo quanto o SELinux, mas provê segurança extra para os
arquivos e portas TCP/UDP.

A partir da versão 18.04 do Ubuntu, o AppArmor está instalado como padrão, mas as
ferramentas e políticas devem ser instalados com o comando:

# apt install apparmor-utils apparmor-profiles

O AppArmor também define os acessos aos arquivos e portas do sistema através de políticas,
que são nomeadas de profiles.

Os profiles do AppArmor residem no diretório /etc/apparmor.d:

$ ls -1
abstractions
apache2.d
bin.ping
nvidia_modprobe
sbin.dhclient
( ... )

Normalmente cada aplicação instala o seu profile no diretório /etc/apparmor.d quando seu
pacote é instalado utilizando-se o gerenciador de pacotes.

O nome de cada profile geralmente faz referência ao caminho do programa de alguma


determinada aplicação.

Cada profile é um arquivo texto que define quais arquivos e portas uma determinada
aplicação pode acessar.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 401


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Os profiles utilizam variáveis que são definidas e armazenadas no diretório


/etc/apparmor.d/tunables. Estas variáveis utilizadas nos profiles são chamadas de
tunables.

É possível alterar as variáveis tunables, e com isso fazer alterações em todos os profiles que
as utilizam sem alterar o profile.

Iniciando o AppArmor
O AppArmor pode ser habilitado utilizando o seguinte scripts:

# /etc/init.d/apparmor start

Para desabilitar o AppArmor:

# /etc/init.d/apparmor stop

Estados dos Profiles


Os profiles do ApparMor podem funcionar em um dos dois modos: enforcement e
complain.

Os profiles carregados no modo de enforcement resultarão na imposição da política


definida no perfil e relatando as tentativas de violação da política (via syslog ou auditd).

Os perfis no modo complain não aplicarão a política, mas somente relatarão tentativas de
violação.

aa-status

O comando aa-status pode determinar o status do AppArmor no sistema, e quais políticas


estão configuradas em qual modo (enforcement / complain):

$ sudo aa-status
apparmor module is loaded.
64 profiles are loaded.
43 profiles are in enforce mode.
/sbin/dhclient
/snap/core/8268/usr/lib/snapd/snap-confine
/snap/core/8268/usr/lib/snapd/snap-confine//mount-namespace-
capture-helper
/usr/bin/evince
( ... )

21 profiles are in complain mode.


402 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

/usr/sbin/dnsmasq
/usr/sbin/dnsmasq//libvirt_leaseshelper
avahi-daemon
( ... )

aa-complain

Para desabilitar um determinado profile, pode-se usar o comando aa-complain:

# aa-complain /usr/sbin/cupsd
Setting /usr/sbin/cupsd to complain mode.

No modo complain o AppArmor irá apenas relatar violações de poíticas.

aa-enforce

O comando aa-enforce pode ser usado para colocar um profile no modo enforce:

# aa-enforce /usr/sbin/cupsd
Setting /usr/sbin/cupsd to enforce mode.

aa-disable

Para desabilitar completamente um profile, pode-se usar o comando aa-disable:

# aa-disable /usr/sbin/cupsd
Disabling /usr/sbin/cupsd.

aa-unconfined
O comando aa-unconfined gera uma lista de processos com portas tcp ou udp que não têm
perfins do AppArmor carregados:

# aa-unconfined
620 /usr/sbin/sshd not confined
3784 /usr/sbin/apache2 not confined
13694 /usr/sbin/NetworkManager not confined
23509 /usr/sbin/apache2 not confined

O número na frente do processo é o PID do programa em execução.

O comando "ss -lpn" pode mostrar os processos em execução em cada porta:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 403


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

# ss -lpn | grep apache


tcp LISTEN 0 128 *:80 *:*
users:(("apache2",pid=23509,fd=4),("apache2",pid=3784,fd=4))

Limitando as contas de usuário

Outra tarefa importante de administração do sistema no quesito segurança é limitar as


contas de usuário, delimitando a forma de login, quantidade de memória, tamanho dos
arquivos, limites entre os processos, dentre outros.

O primeiro utilitário para delimitar o uso dos recursos do sistema é o ulimit.

Também há a limitação por validade da senha, exigindo sua troca, ou validade da conta. O
comando que atua nas propriedades de validade da senha e do acesso é o chage.

ulimit
$ ulimit [opções] recurso

O utilitário ulimit configura ou mostra as configurações sobre o uso dos recursos no sistema,
como tamanho dos arquivos que podem ser salvos pelo shell ou por processos filhos.

Os recursos que podem ser limitados são: tamanho do segmento de dados (heap) dos
processos, tamanho máximo dos arquivos, tamanho descritor de arquivos, tamanho da pilha
(stack) dos processos, tempo máximo de CPU e tamanho da memória virtual.

É importante saber que o ulimit somente limita os recursos do processo corrente do shell ou
dos seus processos filhos.

Se nenhum valor de limite for indicado na linha de comando, o ulimit irá mostrar os limites já
configurados.

$ ulimit
unlimited

Tipos de Limite

Os limites no BASH podem ser de dois tipos: leves (soft-limits) e físicos (hard-limits).

O primeiro tipo de limite funciona como uma área de aviso e o segundo realmente impõe o
uso máximo do recurso. A opção “-H” informa que o limite é físico e a opção “-S” para leve.
Se nenhuma destas opções for especificada, ambos os limites serão configurados com o
mesmo valor.

404 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Qualquer usuário poderá configurar um limite leve abaixo do limite físico pré-estabelecido,
como qualquer usuário poderá diminuir um limite físico. Somente o super-usuário pode
aumentar um limite físico.

Suas opções mais comuns são:

-a: Mostra os limites correntes;


-c: Máximo de tamanho do arquivo de dump (em blocos de 512-byte);
-d: Máximo do segmento de dados do processo ou heap (kbytes);
-f: Máximo do tamanho de um arquivo (em blocos de 512-byte);
-n: Máximo de descritores de arquivos;
-s: Máximo da pilha dos processos ou stack (kbytes);
-t: Máximo de tempo de CPU (em segundos para cada processo);
-v: Máximo de memória virtual (kbytes).

Veja os exemplos abaixo:

Para limitar a pilha dos processos em 512 kbytes:

$ ulimit -s 512

A opção "-a" mostra todos os limites:

$ 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) 7753
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) 512
cpu time (seconds, -t) unlimited
max user processes (-u) 7753
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

Para limitar o número de descritores de arquivos:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 405


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

$ ulimit -n 12

A opção –m pode limitar o máximo de memória que pode ser utilizada em kbytes:

$ ulimit –m 2000

A opção –v pode limitar o máximo de memória virtual (incluindo o swap):

$ ulimit –v 50000

A opção –n pode limitar o número de arquivos que podem ser abertos por programas
executados pelo usuário:

$ ulimit –n 1024

A opção –u pode limitar o número de processos que podem ser executados pelo usuário:

$ ulimit –u 400

As opções –n (número de arquivos abertos) e –u (número de processos) são úteis em


servidores, de forma a se evitar que um determinado programa tome todos os recursos do
servidor. Isto é especialmente útil por exemplo em servidores Web, que podem sofrer
ataques de Denial Of Service.

Os limites configurados são perdidos depois que a sessão do usuário é fechada. O arquivo
/etc/security/limits.conf define os limites para os usuários de forma permanente no
sistema.

O próximo comando para limitar as contas de usuário é o chage, que modifica as


informações de expiração.

Gerenciamento de Senhas

O Linux suporta que as senhas dos usuários possam ter data de expiração.

Quando uma conta de usuário é criada com o comando useradd, o Linux verifica se há
cadastrado uma data de expiração da senha no arquivo /etc/default/useradd, buscando a tag
EXPIRE:

$ cat /etc/default/useradd
SHELL=/bin/sh
GROUP=100
406 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

HOME=/home
INACTIVE=-1
EXPIRE=
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

Se houver um valor para esta variável, será configurado para a nova conta uma data de
expiração da senha, forçando o usuário a troca-la dentro do prazo.

Mas, uma vez que as contas de usuário já estão criadas, o comando para visualizar e alterar
as datas de expiração das senhas é o chage, já abordado no tópico de gerenciamento de
contas de usuário.

Para alterar uma data de expiração de senha, pode-se usar a opção -M seguido do número de
dias em que aquela senha é válida:

# chage -M 180 uiraribeiro

Para visualizar a expiração da senha de um usuário:

$ chage -l uiraribeiro
Last password change : Apr 23,
2019
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

Um usuário pode alterar sua senha a qualquer momento com o comando passwd:

$ passwd
Current password:
New password:

Somente o root pode alterar a senha de outros usuários com o comando passwd seguido da
conta do usuário:

# passwd carla

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 407


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

chage
# chage [opções] login

O comando chage lida com a expiração das contas de usuário.

As expirações são gravadas no arquivo /etc/shadow.

Suas opções são:

-E data: Informa a data de expiração no formato ano, mês e dia

(AAAA-MM-DD). Se for informado “-1” (menos 1), irá remover a data de validade da conta.

-l: Lista as configurações da conta do usuário. Esta opção pode ser utilizada por
qualquer usuário.
-d N ou AAAA-MM-DD: Configura o número N de dias da última modificação de
senha desde 01/01/1970. Também aceita uma data no formato AAAA-MM-DD.
-E N ou AAAA-MM-DD: Configura número N de dias em que a conta será
desabilitada desde 01/01/1970. Também aceita uma data no formato AAAA-MM-DD.
-I N: Configura o número N de dias de inatividade após a expiração da senha em que
a conta será desabilitada.
-m N: Configura o número N mínimo de dias de validade de uma senha. Um valor
zero permite que o usuário troque de senha a qualquer hora.
-M N: Configura o número N máximo de dias de validade de uma senha, forçando o
usuário a troca-la.
-W N: Configura o número N de dias em que um aviso será dado ao usuário antes da
troca da senha.

As definições de parâmetros padrão das contas de usuário estão no arquivo /etc/login.defs

Exemplo:

# chage –E 2016-05-23 cristiane

O comando chage também pode operar de forma interativa, apenas informando a conta do
usuário sem nenhuma opção:

# chage arthur
Changing the aging information for arthur
Enter the new value, or press ENTER for the default
Minimum Password Age [0]: 10
Maximum Password Age [99999]: 60
Last Password Change (YYYY-MM-DD) [2019-10-17]:
408 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

Password Expiration Warning [7]: 7


Password Inactive [-1]: 10
Account Expiration Date (YYYY-MM-DD) [2019-10-31]:
2019-10-31

As informações de expiração da conta podem ser visualizadas com a opção "-l" do comando.

Permissões Especiais de Execução

SUID e SGID
Os programas são geralmente sempre executados em nome e com as permissões dos
usuários que os executou.

No entanto, em algumas situações especiais, é necessário executar um programa como se


fosse outro usuário, com as permissões deste usuário. Isto geralmente acontece quando se
executa algum programa servidor.

Para executar um programa como outro usuário, os bits SUID e SGID devem estar
habilitados. Desta forma, o programa irá ser executado com as permissões do usuário e do
grupo de usuários ao qual ele pertence e não do usuário que o executou.

Para identificar um arquivo que tenha os bits SUID e SGID habilitados, ele tem um “s” no
lugar das permissões de execução“x”:

-rwsrwsr-x 1 nginx user 48 set 27 11:33 script

O “s” na primeira posição significa que o bit SETUID (ou SUID) foi definido. O segundo "s"
na classe de Grupo significa que o o bit GUID foi definido.

Quando o SUID está definido, o Kernel executa o arquivo com o ID de usuário (e seus
privilégios) do proprietário desse arquivo, não do usuário que o executou. Mas existe uma
exceção quando o sistema de arquivos for montado com a opção nosuid.

O bit SUID não deve ser confundido com o bit sticky, que no Linux é normalmente usado, e
honrado, apenas em diretórios. Quando definido, esse bit significa que apenas o proprietário
de um diretório pode desvincular, excluir ou renomear os arquivos que ele contém.

O Perigo do SUID e SGID


Os bits de SUID e SGID devem ser utilizados com muita cautela, uma vez que qualquer
arquivo com esses bits configurados vão ser executados com as permissões do dono do
arquivo. Isso é especialmente perigoso se o dono do arquivo for o super-usuário root.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 409


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Kernel ignora SUID de scripts


O Kernel ignora os bits SUID e SGID de scripts por uma questão de segurança.

Qualquer programa que use o shebang "#!", independente do interpretador, terá os bits de
SUID e SGID ignorados por questão de segurança. Isso porque os scripts executam
programas e outros scripts, então o risco de vários programas e outros scripts serem
executados com as permissões do dono do script é um risco muito grande.

A única maneira de executar um script com as permissões de outro usuário é usando um


wrapper genérico, como o comando sudo.

Procurando por Executáveis com


SUID/SGID

A permissão de SUID / SGID permite que um programa seja executado com as permissões do
usuário que é o proprietário do arquivo executável deste programa. Isto é especialmente útil
se esse determinado programa precisa ser executado com uma determinada conta de
usuário para que possa ter acesso aos recursos de que necessita.

Mas isto pode ser especialmente perigoso quando o dono do arquivo que estão com os bits
SUID/SGID habilitados é o superusuário root. Isso dá ao programa em questão super poderes
no sistema para fazer virtualmente qualquer coisa.

Desta forma, um cuidado especial deve ser tomado com os arquivos que utilizam os bits
SUID/SGID habilitados. Faz parte das tarefas de um bom administrador varrer o sistema de
arquivos em busca de programas que tem essas permissões especiais e minimizar ao
máximo o seu uso para evitar brechas de segurança.

O comando find pode ser utilizado para varrer o sistema de arquivos em busca de arquivos
com os bits SUID/SGID habilitados.

O ideal é rodar esse comando com privilégios de root, para que todo o sistema de arquivos
possa ser auditado:

A opção "-perm" do find é capaz de encontrar arquivos com permissões específicas. Há duas
maneiras de escrever as permissões:

Utilizando a dotação numérica, onde a permissão SUID é descrita como 4000 e o SGID
como 2000.
Utilizando a dotação com letras, onde a permissão "-u+s" é usada para buscar SUID e
"-g+s" para buscar SGID.

Exemplos:

Para encontrar os arquivos com o bit SUID habilitado:

410 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

# find / -perm /4000

Para encontrar os arquivos com o bit SGID habilitado:

# find / -perm /2000

Para encontrar os arquivos com AMBOS os bits SUID e SUIG habilitados, soma-se as
permissões (4000+2000):

# find / -perm /6000

Para procurar por arquivos com SUID e SGID utilizando as letras das permissões, pode-se
usar a empressão "-or" para fazer uma busca de arquivos com SUID ou com SGID:

# find / -perm -u+s -or -perm -g+s

Pode-se refinar a busca, excluindo os erros, enviando a saída de erros para /dev/null:

# find / -perm -u+s -or -perm -g+s 2>/dev/null

Se quiser refinar mais ainda, listando as permissões, pode-se combinar o comando "ls" com a
opção "-exec":

# find / -perm -u+s -or -perm -g+s -exec ls -l {} \; 2>/dev/null

O seguinte shell script pode ser usado para buscar por arquivos que possuam o SUID e enviar
e-mail para o administrador de rede:

#!/bin/bash
find / -path ‘/proc’ -prune -or -perm -u+s -exec ls -l {} \;
2>/dev/null 1> /tmp/suid
mail root < /tmp/suid

Ele produzirá uma lista de arquivos que possuem este bit habilitado.

Executando Programas com a Permissão


de Outro Usuário

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 411


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

O Linux permite que você execute algum programa com a permissão de outro usuário
através do utilitário sudo ou assuma outra conta de usuário como se estivesse logado com
ela com o comando su.

sudo
$ sudo [opções] comando

O comando sudo executa um determinado comando como se fosse outro usuário.

Caso o usuário que executou o sudo seja um usuário comum, ele deverá saber a senha do
usuário que deseja executar o comando.

Caso o usuário que executou o sudo seja o root, o sudo não irá perguntar a senha de nenhum
usuário, já que o root tem superpoderes.

Exemplo:

# sudo -u uira /bin/mail uiraribeiro@terra.com.br


Subject: teste
Estou mandando uma mensagem como se eu fosse o prof. Uirá
.
EOT

Neste exemplo, o usuário root está mandando um e-mail como se fosse o usuário “uira”.

Observe que, se outro usuário tentar fazer o sudo executar um programa com as permissões
de outro usuário, o sudo irá solicitar a senha do usuário:

uira@linux-7rxb:~> sudo -u carla /bin/mail


carla’s password:

Neste exemplo, o usuário “uira” está tentando enviar um e-mail como se fosse o usuário
“carla”.

O sudo é útil quando você deseja que algum processo execute com um usuário específico, de
forma que as permissões de arquivos estejam corretas para o perfeito funcionamento.

O sudo possui um arquivo de configuração chamado “sudoers” que reside no “/etc”. Este
arquivo define quem pode executar o quê. Somente o root pode ler e editar o /etc/sudoers,
uma vez que qualquer alteração neste arquivo dá permissões especiais para um usuário
executar comandos como se fosse outra pessoa.

Este arquivo define qual usuário tem permissão de executar o que, e até mesmo se uma
autenticação é necessária:

412 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

# cat /etc/sudoers
Defaults
secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/s
bin:/bin:/snap/bin"
# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL

Observe que este arquivo é que da super poderes ao root de executar tudo com a linha "root
ALL=(ALL:ALL) ALL".

Ele também costuma trabalhar com grupos de acesso. Observe que os usuários membros do
grupo "admin" podem executar qualquer coisa como qualquer usuário, inclusive se tornar o
root, e os membros do grupo "sudo" podem executar qualquer comando. Se um usuário não
faz parte destes grupos, ele não pode executar o comando sudo. Algumas distribuições
usam outros grupos como "wheel", etc.

Preferencialmente, o comando visudo deve ser executado pelo root para alterar o arquivo
/etc/sudoers.

su
$ su [opções] [-] [usuário]

O comando su executa o shell como se fosse outro usuário.

Exemplo:

uira@linux-7rxb:~> su -
Password:

Neste exemplo, o usuário “uira” solicita que o Shell seja executado como o usuário “root”.
Desta forma, o usuário “uira” irá ganhar todas as permissões da conta de superusuário no
sistema.

O sinal “-“ faz com que os scripts de carga do shell da conta “root” sejam lidos, como se o
próprio “root” logasse no sistema.

Você também pode especificar um usuário para executar o shell como se fosse ele:

# su uira -

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 413


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Neste exemplo, o usuário root irá executar o shell como se fosse o usuário “uira”.

Em sistemas mais seguros, o usuário “root” nunca tem autorização de entrar diretamente no
sistema. Desta forma, os usuários devem logar com suas contas de acesso e, se precisarem,
deverão executar comandos de superusuário utilizando o “sudo” ou fazendo acesso à conta
de root com o “su”.

Para entrar como root, você pode usar o comando:

$ su root -

Neste caso, você precisa saber a senha do usuário root.

Por este motivo, é comum quando um usuário quer ganhar privilégios do root, utiliza-se o
comando:

$ sudo su -

Desta forma, se o seu usuário estiver no grupo que tem permissões para executar o sudo no
arquivo /etc/sudoers, você só precisa autenticar novamente com a sua própria senha, e não a
senha do usuário root. Essa autenticação é só para confirmar que você é você mesmo.
Dependendo da configuração, nem mesmo essa autenticação é necessária.

sudoedit
$ sudoedit arquivo

O comando sudoedit é útil para editar arquivos com as permissões de outro usuário,
especialmente o root.

Há duas situações que o uso do sudoedit é interessante:

A primeira é quando o administrador do sistema deseja dar permissões para um determinado


usuário editar um arquivo ao qual o este usuário não tenha as permissões de escrita (w), e o
administrador não quer dar permissões totais de "sudo" ao usuário.

O truque é criar um grupo de usuários que pode fazer o sudoedit com o comando groupadd:

# groupadd gruposudoedit

E criar uma linha no arquivo /etc/sudoers para o grupo, permitindo que o grupo
gruposudoedit possa executar o comando sudoedit para o determinado arquivo:

%gruposudoedit ALL = sudoedit /diretorio/arquivo

414 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Feito isso, qualquer usuário que faça parte do grupo gruposudoedit poderá editar o arquivo
com o comando sudoedit:

$ sudoedit /diretorio/arquivo

A segunda situação mais corriqueira é o administrador precisar editar um arquivo do sistema,


especialmente os arquivos de configuração no diretório /etc.

O administrador pode recorrer ao comando "sudo vi" para executar o editor de textos "vi"
como root, e editar o arquivo:

$ sudo vi /etc/services

Acontece que desta forma o "vi" perderá todas as marcações coloridas do texto:

Figura 42 - Vi com marcação colorida

O melhor a se fazer nestes casos, é utilizar o sudoedit, uma vez que ele edita o arquivo, salva
uma cópia temporária, e só então copia a cópia temporária para o arquivo original.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 415


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Simulado
3.2 Configurar e Implementar o Acesso
e Métodos de Autenticação

Parte da segurança de um sistema é a configuração apropriada dos métodos de acesso e


autenticação de usuários.

PAM

O Pluggable Authentication Modules - PAM - provê a autenticação de serviços para o Linux e


aplicações, utilizado em todas as distribuições.

O PAM também fornece serviços de autenticação para aplicações que utilizem a biblioteca
libpam.so. Então os programas podem utilizar a autenticação do PAM ao invés de criar o seu
próprio esquema de autenticação. Além de utilizarem a biblioteca libpam.so, as aplicações
também criam o seu arquivo de configuração do PAM.

Os arquivos de configuração do PAM estão localizados no diretório /etc/pam.d.

$ ls -1 /etc/pam.d
chfn
chpasswd
chsh
common-account
common-auth
common-password
common-session
common-session-noninteractive
cron
( ... )

Cada aplicação que usa o PAM para autenticação tem o seu arquivo de configuração. É no
arquivo de configuração que é construído como se dará o processo de autenticação.

Observe o arquivio /etc/pam.d/login:

$ cat login | grep -v '^#'| grep -v -e '^$'


auth optional pam_faildelay.so delay=3000000
auth [success=ok new_authtok_reqd=ok ignore=ignore
user_unknown=bad default=die] pam_securetty.so
auth requisite pam_nologin.so

416 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

session [success=ok ignore=ignore module_unknown=ignore


default=bad] pam_selinux.so close
session required pam_loginuid.so
session [success=ok ignore=ignore module_unknown=ignore
default=bad] pam_selinux.so open
session required pam_env.so readenv=1
session required pam_env.so readenv=1
envfile=/etc/default/locale
@include common-auth
auth optional pam_group.so
session required pam_limits.so
session optional pam_lastlog.so
session optional pam_motd.so motd=/run/motd.dynamic
session optional pam_motd.so noupdate
session optional pam_mail.so standard
session optional pam_keyinit.so force revoke
@include common-account
@include common-session
@include common-password

Todos os arquivos de configuração do PAM seguem o seguinte esquema:

TIPO FLAG-CONTROLE MÓDULO-DO-PAM [ OPÇÕES-DO-MÓDULO ]

O TIPO se refere ao SERVIÇO que o PAM vai prover ao sistema. Existem quatro tipos
possíveis:

TIPO Descrição

account Provê serviços de validação, como restringir o acesso por horário, limitar o número de usuários
logados, restringir o acesso (acesso do root somente na console) e determinar se a conta
expirou.

auth Provê autenticação do usuário verificando se ele é quem ele diz que é. Isto pode ser feito
exigindo uma senha e verificando se a senha está correta.

password Provê gerencia de senha, exigindo tamanho mínimo e limitando número de senhas incorretas.

session Provê gerenciamento de sessão de contas autenticadas

O FLAG-CONTROLE indica o comportamento do PAM caso o módulo não tenha êxito na tarefa
de autenticação. Os valores que pode assumir são:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 417


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

FLAG Descrição

required Este flag determina que uma falha resultará no retorno de um código de erro para aplicação após
os módulos restantes (para este serviço e tipo) terem sido invocados.

requisite Este flag determina que uma falha resultará no retorno de um código de erro para aplicação de
forma imediata, sem executar os módulos restantes.

optional O código sucesso ou de falha deste módulo só é enviado se ele é o único daquele determinado
tipo.

include Inclui o código de sucesso ou de falha deste módulo no status final.

substack Forca o retorno do status de um tipo com um retorno único.

sufficient Se algum módulo retorna o status de sucesso, e nenhum módulo retornou erro, o flag de
suficiente manda o retorno imediato sem executar o restante da configuração.

O MÓDULO-DO-PAM é o nome do módulo do PAM que fará o trabalho. Cada módulo tem uma
função diferente, e pode requerer ou não OPÇÕES que completem sua configuração.

O processamento do PAM executa o arquivo de configuração linha a linha. A cada linha o


usuário é forçado a passar por um requerimento diferente, que testa a sua autenticação e
requisitos necessários.

A cada linha o usuário ganha um "cartão" de sucesso ou falha, e no final o PAM verifica os
seus cartões de sucesso ou falha para cada módulo e dependendo do FLAG, libera ou não a
entrada definitiva do usuário no sistema ou no aplicativo.

Podemos fazer uma analogia do PAM como um aeroporto:

1. Você chega no guichê de check-in e precisa mostrar a sua passagem (auth).


2. Logo depois é preciso mostrar um documento em que você se autentica pra provar que
você é você mesmo (password).
3. Se a sua reserva estiver ok e também seu vôo (account), as suas malas são
despachadas e você ganha um cartão de embarque.
4. Logo depois, você deve apresentar o cartão de embarque (auth) para passar pelo
Raio-X.
5. No Raio-X você precisa provar que não carrega nada que não seja permitido (account).
Neste passo você não precisa provar quem é, mas se tem os requisitos necessários.
6. Se você estiver limpo de objetos proibidos, você é liberado para seguir para o portão
de embarque.
7. Logo depois, no portão do vôo, você tem de se autenticar novamente, mostrando o
documento e cartão de embarque (auth+password).
8. Ao adentrar no avião, você deve procurar o seu acento e adequar os seus pertences
(session).

Você não precisa saber construir um arquivo de configuração para o exame, mas é
necessário conhecer alguns detalhes do funcionamento do PAM.

418 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Políticas de Senha

Quando uma senha no Linux é alterada pelo comando passwd, o PAM é chamado para
garantir que uma política de senhas fortes esteja presente na senha escolhida.

Os seguintes módulos podem ser usados para implementar uma política de senhas:

pam_unix: este é o módulo padrão de autenticação do Linux, que faz a autenticação


usando /etc/passwd e /etc/shadow.
pam_cracklib: este módulo verifica a senha contra um dicionário de palavras para
garantir que a senha não é comum;
pam_pwhistory: este módulo salva as últimas senhas em /etc/security/opasswd para
garantir que o usuário não use a mesma senha;
pam_pwquality: este módulo usa o pam_cracklib para performar outras checagens
de qualidade de senha.

O módulo pam_pwquality utiliza um arquivo de configuração em


/etc/security/pwquality.conf, que define a qualidade que a senha tem de ter para não ser
quebrada facilmente por força bruta.

Bloqueio de Usuários
O PAM pode ser configurado para bloquear as contas de usuário por um certo tempo, depois
que algumas tentativas de autenticação falharem. Isso evita o ataque de força bruta, de
movo que diversas senhas são testadas até que uma seja autenticada.

Os módulos pam_tally2 e pam_faillock fazem a contagem de tentativas de acesso, e


podem bloquear uma conta caso o número de tentativas ultrapasse o parâmetro de
contagem. Ambos os módulos fazem a mesma coisa, e qual usar vai depender da distribuição
Linux.

No Ubuntu e Debian:

Para adicionar o limite de tentativas de autenticação, deve-se alterar o arquivo


/etc/pam.d/common-auth no Ubuntu, antes da linha que contém "auth (...) pam_unix".
No Ubuntu utiliza-se o módulo pam_tally2:

$ cat /etc/pam.d/common-auth
auth required pam_tally2.so deny=2 silent
auth [success=1 default=ignore] pam_unix.so
nullok_secure

A opção deny=X, configura o número X de tentativas de senha errada possíveis antes do


trancamento da conta. A opção silent define que o usuário não deve ser alertado.

Pode-se usar o utilitário pam_tally2 para consultar as tentativas de autenticação que


ultrapassaram o limite.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 419


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

# pam_tally2
Login Failures Latest failure From
uiraribeiro 3 12/28/19 15:59:55 10.211.55.2

Uma vez que o usuário errou a senha mais vezes que o permitido, sua conta é travada até
que o administrador destrave manualmente a senha com o comando pam_patty2:

# pam_tally2 -r -u uiraribeiro
Login Failures Latest failure From
uiraribeiro 6 12/28/19 16:01:20 10.211.55.2

A opção "-r" diz para resetar a contagem de erro, e a opção "-u" define qual é a conta.

Para evitar que o administrador precise destravar a senha manualmente, a opção


unlock_time pode ser usada para designar quantos segundos a conta deverá permanecer
travada:

$ cat /etc/pam.d/common-auth
auth required pam_tally2.so deny=2 unlock_time=300 silent
auth [success=1 default=ignore] pam_unix.so nullok_secure

No CentOS e Fedora:

Para adicionar o limite de tentativas de autenticação no CentOS, deve-se alterar ambos os


arquivos /etc/pam.d/system-auth e /etc/pam.d/password-auth com as linhas
destacadas. No CentOS utiliza-se o módulo pam_faillock:

$ cat /etc/pam.d/system-auth
auth required pam_env.so
auth required pam_faillock.so preauth silent audit deny=3
unlock_time=300
auth sufficient pam_fprintd.so
auth sufficient pam_unix.so nullok try_first_pass
auth [default=die] pam_faillock.so authfail audit deny=3
unlock_time=300
auth requisite pam_succeed_if.so uid >= 1000 quiet
auth required pam_deny.so

( ... )

420 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

account required pam_permit.so


account required pam_faillock.so

O comando faillock mostra as tentativas de senha que ultrapassaram o número máximo.

$ faillock
uiraribeiro:
When Type Source Valid
2019-12-28 16:31:33 RHOST 10.211.55.2 V

Para resetar manualmente uma conta:

# faillock --user uiraribeiro --reset

Limitando o Acesso do Root

É bem comum as distribuições limitarem o uso da conta do administrador root somente para
alguns terminais, por questão de segurança. Isso se deve porque parte do processo de
autenticação é necessário conhecer o login do usuário, e depois sua senha.

Desta forma, é uma boa prática limitar o acesso do root somente para a console (estar
presente fisicamente no terminal), e permitir que somente usuários comuns façam login no
sistema. E um destes usuários sendo o administrador, pode utilizar o comando sudo para
ganhar os super-poderes do root.

Há um módulo do pam chamado pam_securetty que faz o trabalho de restringir o acesso do


root, liberando seu acesso somente aos terminais listados no arquivo /etc/securetty:

$ cat /etc/securetty
console
# Local X displays
:0
:0.0
:0.1
# Virtual consoles
tty1
tty2
tty3

Neste exemplo, o root poderá logar na console (terminal físico), no terminal gráfico (X
displays), representado por ":0", ":0.1", etc e em consoles virtuais (tty*).

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 421


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Se o módulo pam_securetty está implementado nas configurações no diretório /etc/pam.d,


mas não existe um arquivo /etc/securetty, o usuário root poderá logar em qualquer
terminal.

Integração do PAM com LDAP


Em ambientes corporativos é comum integrar todas as contas e senhas num serviço de
diretório, de forma a centralizar a autenticação de todos os serviços em um só lugar.

A indústria de software criou um serviço de diretório chamado Lightweight Directory Access


Protocol - LDAP - adotado por diversas empresas como padrão de mercado.

A Microsoft foi a primeira a utilizar o LDAP, criando o Microsoft Active Directory, que faz este
tipo de serviço de centralizar as senhas em ambientes Windows.

No mundo OpenSource, o pacote OpenLDAP fornece implementações tanto do lado servidor


quanto do lado cliente para implementar o LDAP.

A versatilidade do Linux permite que ele utilize o Microsoft Active Directory ou outro serviço
de diretórios como o OpenLDAP ou o Samba, para fazer a autenticação dos usuários
utilizando o PAM.

O módulo pam_ldap pode ser utilizado para fazer a integração do PAM com um serviço de
diretórios baseado no LDAP.

Este módulo utiliza o arquivo de configuração /etc/ldap.conf para configurar seu serviço, e
requer que o arquivo /etc/pam.d/system-auth seja alterado em sistemas baseados em
RedHat, como o Fedora e CentOS.

No Debian e Ubuntu é melhor que se utilize a ferramenta pam-auth-update para alterar os


diversos arquivos /etc/pam.d/common-*.

Figura 43 - pam-auth-update
422 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

As configurações para cada distribuição acessar o LDAP são bem particulares, de forma que é
preferível consultar a documentação da distribuição.

Criptografia de Dados

O principal objetivo da criptografia é codificar uma mensagem de forma que ela fique privada
ou escondida. Os algoritmos de criptografia modernos usam o conceito de chaves para
criptografar e descriptografar mensagens.

Par de Chaves de Criptografia

O par de chaves são sequencia de bits muito longas que são criadas por um algoritmo
específico. Desta forma, o que é criptografado com uma chave, só pode ser descriptografado
pelo seu par.

As chaves funcionam como multiplicação de números primos. Cada chave é um número


primo. A multiplicação resultante só pode ser dividida por um dos fatores.

Por exemplo, imagine que uma chave pública é número primo 3, e que outra chave privada é
o número primo 7. Quando multiplicadas, produzem uma mensagem criptografada de
número 21. Este número 21 somente poderá ser descriptografado - ou dividido - pelos
fatores chaves primos 3 ou 7. O conceito é esse.

Então, deste par de chaves, uma pode ser distribuída livremente, chamada de chave
pública, e a outra deve ser guardada com todo zêlo possível, chamada de chave privada.

Quanto maior o tamanho da chave em bits, melhor a criptografia, e com isso, mais tempo
será necessário para "quebrar" a criptografia na força bruta. Felizmente os computadores
não são rápidos para quebrar números primos gigantescos, tornando o processo de
descriptografia na força bruta economicamente inviável.

Desta forma, para que aja uma comunicação criptografada utilizando par de chaves, é
necessário que os dois mensageiros troquem as suas chaves públicas entre sí.

Quando o mensageiro A quer mandar uma mensagem para o mensageiro B, ele critografa a
mensagem com a chave pública do mensageiro B.

Desta forma, somente o mensageiro B que possui a chave privada é capaz de descriptografar
a mensagem.

E quando o mensageiro B quer mandar uma mensagem para o mensageiro A, o mesmo


processo ocorre: os dados são critografados com a chave pública de A, de forma que
somente o mensageiro A possui a chave privada para descriptografar a mensagem.

Este mesmo processo ocorre quando você tenta acessar uma página de Internet com o seu
navegador utilizando o protocolo HTTPS, que transfere dados de forma criptografada entre o
servidor e seu navegador de Internet.

Quando seu navegador conecta no servidor com HTTPS, ele envia a sua chave pública para o
servidor, e o servidor envia a chave pública dele para seu navegador. Assim, todos os dados

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 423


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

que o navegador enviar para o servidor serão critografados com a chave pública do servidor,
e tudo que o servidor enviar para seu navegador será criptografado com a sua chave pública.
Não adianta alguém no meio do caminho capturar os pacotes de rede, pois somente o
servidor e você poderão acessar seu conteúdo.

Mas como confiar que a chave pública de alguém é mesmo da pessoa que alega ser? Como
saber que a chave pública de uma empresa é mesmo da empresa, e não de um falsário que
imitou o site da empresa e criou uma chave pública qualquer?

Para resolver esta questão, criou-se uma hierarquia de autoridade, através de uma infra-
estrutura de certificação de chaves públicas.

Public Key Infrastructure - PKI

Para garantir que as chaves públicas sejam realmente de quem alega ser, criou-se um
sistema em que algumas poucas empresas atuam como Autoridade de Certificados (CA).

A Microsoft, Google, Godaddy, Certisign, Verisign, Amazon e outras poucas empresas no


mundo são Autoridade de Certificados (CA). Essa limitação geralmente é econômica,
limitando o ingresso de muitas empresas no sistema como CA. No Brasil, por exemplo, para
se tornar uma entidade CA, é preciso cumprir com uma série de requisitos técnicos e pagar
uma taxa de US$ 120.000.

Estas empresas certificadoras (CA) fazem o serviço de autenticar que pessoas, empresas e
servidores na Internet sejam verificadas para garantir a sua autenticidade (ser quem diz ser)
e que tem a autoridade (possuir uma chave pública) autentica.

A empresa, pessoa ou servidor que deseja ser autenticada pelo CA, precisa comprovar de
alguma forma que ela é quem diz ser, seja através de envio de documentos, ou alguma outra
forma de autenticação, e precisa também enviar a sua chave pública para a empresa CA.

A empresa autenticadora (CA) depois de autenticar o solicitante, emite um Certificado


Digital atestando que aquela determinada chave pública é verdadeira e autêntica,
pertencendo a quem de direito.

A empresa solicitante então coloca junto com a sua chave pública o Certificado Digital
emitido pela CA que atesta a sua validade e veracidade.

Então, quando um servidor na Internet envia a sua chave pública para um cliente, envia junto
o Certificado Digital que atesta a sua identidade. A aplicação cliente então verifica se o
certificado digital é válido através de uma cadeia de servidores raízes da qual a entidade
certificadora (CA) faz parte.

É comum que as entidades certificadoras (CA) cobrem pela emissão do Certificado Digital,
que tem uma validade predeterminada no ato da emissão.

Auto-assinatura de Certificado Digital

É possível que uma pessoa, empresa ou entidade auto-assine e emita o seu próprio

424 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

certificado digital para a sua própria chave pública. É meio esquisito você mesmo certificar
que você é quem diz ser. É como você imprimir a sua própria carteira de identidade.

Mas em um ambiente de testes, é perfeitamente possível fazer isso, para testar uma
determinada aplicação sem a necessidade de pagar por um certificado digital emitido por um
CA.

Os navegadores de Internet utilizam uma lista das empresas CA com as suas chaves públicas
internamente, e quando recebem um certificado digital que não foi emitido por um CA válido
(auto-assinado), emitem uma mensagem avisando o usuário de que aquele determinado
certificado não é seguro porque não pode ser validado por um CA. O usuário até pode
continuar a conexão, mas por sua própria conta e risco.

Hashing

Outro conceito importante na criptografia é o Hashing, que é transformar um texto numa


sequência fixa de caracteres, impossível de ser convertida novamente no texto original.

Este conceito é utilizado na criptografia de senhas, e também na verificação de arquivos para


garantir que estão íntegros.

Como é impossível desfazer um hashing, a validação é feita por comparação de hash.

Desta forma, é necessário gerar um segundo hash com algum texto, e comparar esse hash
gerado com o hash original. Se a sequência de hash bater uma com a outra, significa que o
texto do segundo hash é o mesmo que o texto original. Este é o esquema de verificação de
senhas do Linux utilizado no arquivo /etc/shadow que armazena os hashes das senhas dos
usuários.

Para que o hashing seja seguro, é necessário que o algoritmo utilizado seja livre de colisão,
de forma que dois textos distintos nunca gerem o mesmo hash. Os algoritmos MD5 e DES são
antigos e podem gerar colisão de hash, não sendo indicados nos dias de hoje.

O hash ainda permite o uso de um "tempero", chamado de salt, que é uma sequência de
caracteres, geralmente aleatória, usada para gerar o hash, e funciona como uma senha.
Desta forma, para gerar um hash de comparação, é necessário conhecer o salt utilizado no
primeiro hash.

O arquivo /etc/shadow do Linux utiliza um salt para cada conta de usuário, de forma que se
um usuário utilizar a mesma senha que um outro, os hashes serão diferentes, pois usam um
salt diferente. Isto torna a verificação por hash ainda mais forte.

Assinando Transmissões com Hashing

Uma aplicação interessante para o Hashing é a assinatura de transmissões, sejam elas


mensagens de texto ou arquivos com dados binários, como PDF, ISO, TAR, GZ, ZIP, etc.

Desta forma, uma pessoa pode assinar digitalmente uma mensagem, e transmitir junto com
a mensagem em texto, o hashing da mensagem em forma de assinatura.

Desta forma, o receptor pode fazer o hashing da mensagem e comparar com o hash da
assinatura para verificar que o texto da mensagem não foi alterado.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 425


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Este método precisa também usar estrutura de um PKI com uso de Certificados Digitais, uma
vez que alguém no caminho pode alterar a mensagem e emitir um novo hash para
assinatura. Desta forma, os documentos assinados digitalmente são validados por entidades
certificadoras.

Os gerenciadores de pacotes do Linux utilizam o hashing para garantir que os repositórios de


software e os pacotes sejam originais e possam sem validados, garantindo que nenhum
software instalado venha de uma fonte duvidosa ou fraudulenta.

Secure Shell - SSH

O pacote OpenSSH oferece serviço de acesso remoto a computadores com o Linux de forma
segura com conexão criptografada ponta a ponta.

Ele utiliza o protocolo ssh (secure shell) para permitir a transferência de arquivos e shell
seguro.

Ele foi criado para substituir os servidores de conexão que trafegam dados sem criptografia
como o telnet, rsh e rlogin. A versão de código aberto gratuito pode ser obtida no site
http://www.openssh.org ou no instalada diretamente como pacote na maioria das
distribuições.

O OpenSSH conta com portabilidade para diversos sistemas como Linux, Solaris, FreeBSD,
NetBSD, AIX, IRIX, HP-UX e OpenBSD.

A instalação do OpenSSH é simples e pode ser feita através de pacotes com o apt-get no
Debian ou yum no Redhat.

A criptografia do OpenSSH utiliza o conceito de par de chaves públicas e privadas.

Algoritmos de Criptografia

OpenSSH suporta vários algoritmos de assinatura para chaves de autenticação que podem
ser divididos em dois grupos, dependendo das propriedades matemáticas que exploram:

DSA e RSA, que dependem da dificuldade prática de fatorar o produto de dois


grandes números primos;
ECDSA e Ed25519, que dependem do problema do logaritmo discreto da curva
elíptica.

Algoritmos de criptografia de curva elíptica (ECC) são uma adição mais recente aos sistemas
de criptografia de chave pública. Uma de suas principais vantagens é a capacidade de
fornecer o mesmo nível de segurança com chaves menores, o que torna operações menos
computacionalmente intensivas (ou seja, criação de chaves mais rápidas, criptografia e
descriptografia também.

Configuração do cliente OpenSSH 2


Para cada usuário, o ssh também cria os seus pares de chaves, que residem no subdiretório
426 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

".ssh" do diretório HOME do usuário. A qualquer momento, o usuário pode criar seus pares de
chave com o comando ssh-keygen:

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key
(/home/uiraribeiro/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Your identification has been saved in
/home/uiraribeiro/.ssh/id_rsa.
Your public key has been saved in
/home/uiraribeiro/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:7p177xnRUY0HDcrdUbDCQg uiraribeiro@Notebook-do-Uira
The key's randomart image is:
+---[RSA 2048]----+
| E==o=+=o .. |
| =+ =o.=.oo|
| = +o oo |
+----[SHA256]-----+

O ssh-keygen pode criar os seguintes pares de chaves com diferentes algoritmos de


criptografia:

Chave privada DSA: ~/.ssh/id_dsa (DSA);


Chave pública DSA: ~/.ssh/id_dsa.pub (DSA);
Chave privada ECDSA: ~/.ssh/id_ecdsa (ECDSA);
Chave pública ECDSA: ~/.ssh/id_ecdsa.pub (ECDSA);
Chave privada Ed25519: ~/.ssh/id_ed25519 (Ed25519);
Chave pública Ed25519: ~/.ssh/id_ed25519.pub (Ed25519);
Chave privada RSA: ~/.ssh/id_rsa (RSA);
Chave pública RSA: ~/.ssh/id_rsa.pub (RSA)

Autenticação sem senha

O usuário pode se desejar copiar sua chave pública para o diretório HOME do usuário que usa
para conectar em na máquina remota no arquivo ~/.ssh/authorized_keys. Assim, ele não
necessitará mais de fornecer a senha para uma conexão remota com o esse determinado
host e usuário.

/etc/ssh_config

O cliente ssh mantém um arquivo /etc/ssh/ssh_config para as configurações do cliente SSH.


Dentre elas destacam-se:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 427


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Protocol 2 # permite que somente o SSH2 seja usado


Port 22 # altera a porta padrão do SSH de 22
para outra
ForwardX11Trusted no # não permite login remote via X11

Conexão Remota usando o SSH

Quando uma conexão a um servidor SSH é feita, há uma troca de chaves públicas entre o
cliente ssh e o servidor sshd.

Então quando o servidor deseja enviar algo para o cliente, ele utiliza a chave pública do
cliente para criptografar os dados para ele. Somente a chave privada do cliente é capaz de
descriptografar aquilo que foi criptografado com a sua chave pública.

O mesmo acontece quando o cliente quer enviar algo para o servidor. Ele utiliza a chave
pública do servidor para criptografar algo para ele. Desta forma somente a chave privada do
servidor é capaz de ler o seu conteúdo.

Para se conectar em um host usando o ssh, o comando segue o padrão:

$ ssh nomedousuario@enderecodohost

E para fazer conexão com protocolo X11, usa-se a opção "-X" ou "-Y":

$ ssh -X uiraribeiro@server.certificacaolinux.com.br

O ssh troca automaticamente as chaves publicas do usuário local com as chaves do usuário
remoto, de forma transparente.

Também é possível executar remotamente um comando no host de destino usando o ssh:

$ ssh uiraribeiro@server.certificacaolinux.com.br svn


/var/www/html

Neste exemplo, o ssh fará a autenticação, e executará o comando "svn /var/www/html" no


servidor remoto.

O ssh permite especificar uma porta de conexão, quando a porta 22 não é a porta padrão do
servidor remoto:

$ ssh -p 2222 uiraribeiro@server.certificacaolinux.com.br

A opção "-p" permite especificar a porta.

428 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

ssh_know_hosts

O arquivo /etc/ssh/ssh_known_hosts ou ~/.ssh/known_hosts é consultado quando o


método de acesso utilizado é baseado na autenticação RSA. Este arquivo contém as chaves
públicas de uma máquina para que a conexão seja bem-sucedida.

Assim que uma conexão é estabelecida pela primeira vez, o ssh grava um hash do servidor
no arquivo ~/.ssh/know_hosts. Nas próximas conexões esse hash é comparado com o
recebido pelo servidor e do arquivo know_hosts.

Se por algum motivo o servidor for alterado, a comparação irá falhar, o SSH não irá conectar
e vai emitir um alerta, dizendo que o servidor é possivelmente outra máquina e não aquela
conhecida.

Quando há a necessidade de troca do servidor, o cliente ssh deve remover a linha


correspondente ao servidor no arquivo ~/.ssh/know_hosts.

OpenSSH Server
O serviço que provê conexão remota usando o SSH do pacote OpenSSH é o sshd. Este
serviço é executado geralmente através do gerenciador de serviços Systemd.

No momento da instalação do OpenSSH Server, será criada uma chave pública e uma chave
privada do seu host. Na versão 2 do SSH, são criados os seguintes arquivos:

/etc/ssh/ssh_host_rsa_key (chave privada RSA)


/etc/ssh/ssh_host_rsa_key.pub (chave pública RSA)
/etc/ssh/ssh_host_dsa_key (chave privada DSA)
/etc/ssh/ssh_host_dsa_key.pub (chave pública DSA)
/etc/ssh/ssh_host_ecdsa_key (chave privada ECDSA)
/etc/ssh/ssh_host_ecdsa_key.pub (chave pública ECDSA)
/etc/ssh/ssh_host_ed25519_key (chave privada Ed25519)
/etc/ssh/ssh_host_ed25519_key.pub (chave pública Ed25519)

Estas chaves não devem ser alteradas, pois são as chaves de criptografia de seu host. Se
alguma destas chaves for alterada, as máquinas que você conectou não irão mais aceitar
uma conexão sua, pois entenderão que alguém está se passando por você.

sshd_config

O arquivo de configuração principal do sshd é o /etc/ssh/sshd_config. É importante que


este arquivo tenha permissão de leitura e gravação somente para o super usuário, pois ele
contém informações sensíveis, como permitir a entrada do root ou apenas uma lista de
usuários.

O arquivo sshd_config é muito rico em possibilidades de configurações.

Na prova você não será cobrado em saber alterar as opções, mas as seguintes informações

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 429


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

são relevantes:

Protocol 2 # permite que somente o SSH2 seja


usado
Port 4999 # altera a porta padrão do SSH de 22
para outra
ForwardX11 no # não permite login remote via X11
PermitRootLogin no # não permite que o root entre
remotamente
MaxAuthTries 2 # define o número máximo de
tentativas de erro
AllowUsers tom jerry # define quais logins são permitidos
via ssh

Geralmente, por questões de segurança, não é comum permitir que o root faça acesso direto
ao ssh, desta forma o administrador deve entrar com outra conta com privilégios normais e
nos comandos que exigem o super-usuário utilizar o sudo.

Habiltar o sshd

Para iniciar o serviço de ssh servidor:

$ systemctl start sshd

Para habilitar o serviço na carga do sistema operacional:

$ systemctl enable sshd

ssh-agent e ssh-add
Os aplicativos ssh-agent e ssh-add podem ser utilizados para controlar a conexão ssh, de
forma que o usuário não precise digitar sua senha de autenticação na máquina destino a
cada conexão.

É necessário que a máquina destino tenha uma cópia da chave pública do usuário na pasta
home/.ssh do usuário destino na máquina destino:

# scp /root/.ssh2/hostkeys/key.pub root@server:/root/.ssh

O comando “scp” faz uma cópia segura da chave pública criada com o ssh-keygen para o
diretório “/root/.ssh” da máquina destino.

Feito isto, o comando “ssh-agent” mostra quais são as variáveis ambientais que precisam ser
criadas e qual o PID do processo do agente SSH que irá controlar a conexão:

430 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

# ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-lqMuRR398/agent.398; export SSH_AUTH_SOCK;
SSH_AGENT_PID=399; export SSH_AGENT_PID;

Copie e cole no shell o texto que o ssh-agent mostrou:

# SSH_AUTH_SOCK=/tmp/ssh-lqMuRR398/agent.398; export
SSH_AUTH_SOCK;
# SSH_AGENT_PID=399; export SSH_AGENT_PID;

Depois disso, é necessário executar o “ssh-add” e digitar a “passphrase” que foi digitada no
ato da criação das chaves:

# ssh-add
Enter passphrase:

Desta forma, quando você for fazer uma conexão segura com a “maquinadestino”, o ssh não
irá perguntar sua senha.

# ssh root@maquinadestino

Outra forma de fazer isso é copiar o conteúdo da chave pública id_rsa.pub da máquina
cliente para o arquivo ~/.ssh/authorized_keys da máquina servidora. Desta forma quando
o cliente necessitar entrar na máquina servidora, não será exigida senha.

ssh-copy-id
O programa ssh-copy-id pode ser usado para fazer a cópia da chave pública para a máquina
remota de forma segura e rápida. Ele faz a cópia da chave pública do usuário para o servidor
remoto em ~/.ssh.authorized_keys.

$ ssh-copy-id uiraribeiro@10.211.55.73
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed:
/home/uiraribeiro/.ssh/id_rsa.pub
uiraribeiro@10.211.55.73's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh
'uiraribeiro@10.211.55.73'"
and check to make sure that only the key(s) you wanted were
added.

Pessoalmente, eu não gosto de usar este método de acesso sem pedir senha. Uma vez que

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 431


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

sua máquina esteja vulnerável, todas as máquinas em que você usa regularmente o acesso
ssh via chaves também estará comprometido.

Deixando o SSHD mais Seguro


Trocar a porta do SSH

Um dos truques para deixar o ssh mais seguro é trocar a porta padrão de conexão do serviço
de ssh.

Isso pode ser feito alterando o arquivo /etc/ssh/sshd_config, alterando a diretiva "Port".
Geralmente esta linha estará comentada com "#". É preciso desconmentar e alterar a porta
de 22 para alguma outra acima de 1024:

Port 2323

Não permitir login com o Root

Também é interessante desabilitar o acesso do super-usuário root no ssh, permitindo assim


que somente usuários comuns façam login remoto.

Isso pode ser feito alterando o arquivo /etc/ssh/sshd_config, na diretiva


"PermitRootLogin", que deverá estar descomentada e com valor igual a "no":

PermitRootLogin no

Depois de qualquer alteração no arquivo sshd_config, é necessário reiniciar o serviço de


ssh:

# systemctl restart sshd

Uso de Tcpwrapper

Uma técnica antiga no Linux para limitar o acesso a um determinado serviço é o uso do
tcpwrapper.

O tcpwrapper funciona como um porteiro que intercepta uma conexão e verifica se


determinado serviço pode ser acessado por um cliente. Desta forma é possível limitar quais
os endereços IP de clientes que podiam acessar determinado serviço.

Os programas no Linux que fazem uso do tcpwrapper usam a biblioteca libwrap.so.

Para determinar se um programa faz uso do tcpwrapper, pode-se consultar quais bibliotecas
ele utiliza com o programa ldd:

$ ldd /usr/sbin/sshd | grep wrap


libwrap.so.0 => /lib/x86_64-linux-gnu/libwrap.so.0

Neste caso, é possível constatar que o programa sshd, utiliza a biblioteca libwrap, e
432 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

portanto, é capaz limitar quais são os hosts que podem acessar o shell seguro.

Para limitar quais os hosts clientes podem acessar qual serviço, o tcpwrapper consulta os
arquivos /etc/hosts.allow e /etc/hosts.deny para saber quais endereços IP podem acessar
qual serviço.

hosts.allow e hosts.deny

Os arquivos /etc/hosts.allow e /etc/hosts.deny são utilizados para definir regras de acesso


aos serviços oferecidos pelo computador.

O conteúdo dos arquivos hosts.allow e hosts.deny seguem o seguinte formato:

nome_do_serviço: endereço_ip

Há uma lógica e uma ordem estabelecida, que você precisa memorizar para o exame:

Quando uma conexão é estabelecida, o tcpwrapper lê primeiro o conteúdo do arquivo


/etc/hosts.allow. Se existir uma regra para esta conexão ele não checa o arquivo
hosts.deny.

$ cat /etc/hosts.allow
sshd: 10.10.100.1

Se nenhuma regra for encontrada no hosts.allow, ele lê o /etc/hosts.deny à procura de


uma regra. Se for encontrado algo que combine no hosts.deny, ele termina a conexão. Se
nada que combine for encontrado, ele libera o acesso.

Se você quiser que apenas as conexões explicitamente liberadas no arquivo hosts.allow


sejam permitidas, negando qualquer outro cliente não declarado, a regra “ALL:ALL” pode
ser colocada no arquivo /etc/hosts.deny para que somente as conexões explicitamente
definidas pelas regras em hosts.allow sejam aceitas.

Outra combinação possível no hosts.deny é negar tudo por serviço com a regra "sshd:all".
Algumas distribuições trocam a palavra "all" por "paranoid".

Os endereços IP declarados nos arquivos hosts.allow e hosts.deny podem ser tanto na versã
IPv4 quando em IPv6. Mais de um endereço deve ser separado por vírgulas:

sshd: 192.168.0.10, 192.168.0.15

Pode-se declarar também um endereço de uma máquina:

sshd: uira.certificacaolinux.com.br

É possível também liberar por subnet:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 433


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

sshd: 192.168.0.0/255.255.255.0

O tcpwrapper também aceita uma combinação partial, se a linha terminar com um ".":

sshd: 192.168.0.

Neste caso, todos os endereços que iniciam com "192.168.0" estarão incluídos.

A restrição de quais clientes podem conectar em um determinado serviço é uma tarefa hoje
delegada ao uso de um bom Firewall. No entanto, o tcpwrappers oferece uma camada a mais
de segurança, uma vez que se o firewall falhar, há ainda o tcpwrapper para garantir alguma
proteção extra.

Cliente VPN

Mesmo que uma conexão possa ser criptografada através de chaves públicas e privadas, e o
acesso a uma aplicação através seja com uso de SSL/TLS, e ainda que acesso remoto ao shell
também seja criptografado com o ssh, uma VPN fornece mais uma camada de segurança na
comunicação de dados.

Uma VPN - Virtual Private Network - estabelece uma comunicação entre dois sistemas
separados por redes distintas, da forma que possam se comunicar de maneira segura
através da criptografia dos pacotes na camada de rede.

Desta forma, independentemente se a aplicação faz ou não criptografia dos dados, uma VPN
garante que na camada de rede os dados serão transmitidos de forma segura por
criptografia.

O pacote OpenVPN é tradicionalmente usado no Linux para criar uma VPN. O OpenVPN usa o
TLS com transporte de dados UDP na porta 1194.

Independente do pacote de VPN, é preciso conhecer a tecnologia que pode ser utilizada nos
modos de operação de uma VPN:

SSL/TLS

O Secure Socket Layer (SSL) é o protocolo padrão para comunicação segura e criptografada.
Com a evolução do SSL, este protocolo passou a ser chamado de Transport Layer Protocol
(TLS).

Ele usa chaves simétricas para criptografar os dados e chaves públicas para garantir a
identidade do sistema. Os pacotes ainda incluem um código de autenticação para prevenir
alterações no meio do caminho.

Indica-se que se utilize versões do TLS maiores que 1.2, uma vez que as anteriores tem
falhas graves descobertas.

434 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

DTLS

O Datagram Transport Layer Security (DTLS) faz as mesmas coisas que o TLS, mas opera
somente com o transporte UDP. Por isso também é conhecido como UDP TLS. Por ser mais
rápido, as VPNs baseadas no DTLS tem desempenho melhor com a mesma segurança do TLS.

IPSec

O Internet Protocol Security (IPSec) não é um protocolo de criptografia, mas um framework


que opera na camada de rede. Ele provê autenticação, encapsulamento, criptografia de
dados, verificação de integridade e gerenciamento de chaves.

O IPSec opera em duas maneiras: por túnel ou por transporte.

No modo túnel, os dados e cabeçalhos dos pacotes de transporte são protegidos, de forma
que não é possível ver nenhuma informação dos pacotes, de onde vem ou para onde vão.

No modo de transporte apenas os dados são protegidos.

Instalação do Cliente VPN


O pacote OpenVPN é simples de ser instalado através de um gerenciador de pacotes:

# apt install openvpn

Depois de instalado, para ser executado, basta invocar o openvpn com o arquivo de
configuração da vpn:

# openvpn --config config.ovpn

O arquivo .ovpn contém as configurações da VPN fornecidas pelo servidor ou o


administrador da rede.

Um arquivo ovpn típico tem as seguintes configurações:

# define que é um cliente


client
# cria a interface de rede "tun"
dev tun
# usa o protocolo UDP
proto udp
# endereço e porta do servidor VPN
remote servidor.com 1194
# certificado de autoridade (ca)
ca certificado-ca.crt
# certificado digital com chave pública
cert certificado-cliente-chave.crt

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 435


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

# chave privada
key chave-privada.key
# habilita a compressão de dados
comp-lzo

Assim que o openvpn é executado, uma VPN é criada entre o cliente e o servidor, e uma nova
interface de rede é adicionada, formando uma rede privada virtual entre o cliente e o
servidor.

No servidor haverá uma interface de rede para receber as conexões via VPN:

$ ifconfig
tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu
1500
inet 10.8.0.1 netmask 255.255.255.255 destination
10.8.0.2
inet6 fe80::fcdf:bfc6:b58e:ca1c prefixlen 64 scopeid
0x20<link>

E no cliente também será adicionada uma interface para se conectar com o servidor:

$ ifconfig
utun2: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
inet 10.8.0.6 --> 10.8.0.5 netmask 0xffffffff

Desta forma, todo o tráfego de rede direcionado para a nova interface "tun", será
criptografado e seguro com o TLS.

Os endereços IP da VPN são configurados no OpenVPN do Servidor.

Em exemplo, uma conexão ssh ainda mais segura pode ser realizada, informando o endereço
do IP da VPN do servidor:

$ ssh uiraribeiro@10.8.0.1

Desta forma, com o uso de VPN, não é necessário expor o serviço de SSH na Internet na
figura da porta 22 TCP. Apenas a porta 1194 UDP deve estar aberta para receber as
conexões VPN.

A VPN assegura que somente o Host que tenha posse dos certificados e chaves públicas pode
se conectar na VPN.

436 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Simulado
3.3 Melhores Práticas de Segurança em
Linux

Este capítulo explora algumas boas práticas para deixar o seu ambiente Linux ainda mais
seguro. Ele aborda segurança na inicialização do sistema, métodos de autenticação
adicionais, desabilitar serviços e privilégios de root e criptografia de discos.

Segurança de Inicialização e Acesso Físico


Em um ambiente de servidores Linux corporativo é preciso ter todo cuidado com a proteção
dos dados armazenados, para evitar roubo e vazamento de informações comerciais e
confidenciais.

Parte desta política de proteção envolve o acesso físico ao servidor. Alguém com más
intenções e com acesso físico ao servidor pode reiniciar o sistema, plugar um DVD ou um
USB Pendrive, com um Linux de resgate, e ter acesso a todo o conteúdo do disco do servidor.

Para evitar esta ação, o administrador pode objetivamente tomar quatro medidas no
servidor, além de restringir o acesso físico à máquina.

Acesso ao BIOS/UEFI com Senha

A primeira medida é habilitar o acesso com senha ao BIOS/UEFI do servidor e restringir a


sequência de boot do sistema para somente pelo disco rígido local, desabilitando o boot por
CD, DVD, ou qualquer outro dispositivo USB.

Acesso ao Menu do Grub com Senha

Mesmo que uma pessoa não autorizada não consiga mais usar um disco externo para
reiniciar a máquina, o acesso ao Menu do Grub deve ser limitado por senha, de forma que
não se troque as opções de carga do sistema e reinicie o Linux em modo "Single" sem uma
senha.

No Debian e Ubuntu, o utilitário grub-mkpasswd-pbkdf2 pode ser utilizado para criar um


hash de senha para ser colocada nas configurações do grub, de forma a limitar o acesso ao
Menu ou as opções de inicialização:

$ grub-mkpasswd-pbkdf2
Enter password:
Reenter password:
PBKDF2 hash of your password is
grub.pbkdf2.sha512.10000.BB8BE770789F1231191A0B531629DAC79D222355
D1C23D6BC1B8B387FF8AB8316C2E49D15D14CB8EFB5CB72BAB2A898F12F8C133D
BD598EC960C92FB9187D492.DE41025B0CA1FCA923AA85279D53DBEBF4E5DC7E6
85D0E7BE162FC95EEAE0CE0B3C0BAA2041F790106AB9AC991769AE75CCE23896C

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 437


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

B7410FF164274B2D944880

Depois de criado o hash, ele deve ser copiado para o arquivo /etc/grub.d/40_custom da
seguinte forma:

$ cat /etc/grub.d/40_custom
#!/bin/sh
exec tail -n +3 $0
set superuser "uiraribeiro"
password_pbkdf2 uiraribeiro
grub.pbkdf2.sha512.10000.BB8BE770789F1231191A0B531629DAC79D222355
D1C23D6BC1B8B387FF8AB8316C2E49D15D14CB8EFB5CB72BAB2A898F12F8C133D
BD598EC960C92FB9187D492.DE41025B0CA1FCA923AA85279D53DBEBF4E5DC7E6
85D0E7BE162FC95EEAE0CE0B3C0BAA2041F790106AB9AC991769AE75CCE23896C
B7410FF164274B2D944880

Desta forma, o grub irá dar super-poderes ao usuário uiraribeiro, de forma que somente este
usuário com a senha poderão editar as opções de boot do Grub.

Feito isso, o comando update-grub2 deve ser executado:

# update-grub2

Já nas distribuições baseadas em RedHat, como o CentOS e Fedora, o utilitário grub2-


setpassword pode ser utilizado para gerar o arquivo /boot/grub2/user.cfg:

# grub2-setpassword
Enter password:
Confirm password:

O arquivo gerado terá esse formato, parecido com o do Ubuntu/Debian, mas aceita somente
um super-usuário root.

# cat /boot/grub2/user.cfg
GRUB2_PASSWORD=grub.pbkdf2.sha512.10000.61D9795ED7A5C96612B6D263A
BAA026831B43CF252A9484CAF93827C96BF989DDD83B043E0E6C3FE24609C2068
5406734191C17DE564134EA5E060C82002A083.7DCCEDA8E01797847AB04D9015
3172C503AA848B548BCBD7E89206815BAC4BCD900D064F50FDB59311D3FA38F6B
C1985D213099D4B0A5DBF43AE118BAC02922E

Feito isso, deve-se gerar a configuração do Grub2 com o comando grub2-mkconfig:

438 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
done

Desabilitar o Ctrl-Alt-Del

Outra medida importante é desabilitar a combinação de teclas Ctrl-Alt-Del para reiniciar o


computador sem a necessidade de estar logado no sistema.

Nas distribuições Linux que ainda usam o System V Init, o Ctrl-Alt-Del pode ser
desabilitando editando o arquivo /etc/inittab, e alterando qual será o programa que a
combinação de teclas irá executar. Normalmente o Ctrl-Alt-Del invoca o programa
"/sbin/shutdown -r now":

$ cat /etc/inittab | grep ctrlaltdel


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

Portanto, pode-se alterar o comando para escrever no log alguma mensagem:

ca:ctrlaltdel:/bin/logger "Foi pressionado o Ctrl-Alt-Del"

Nas distribuições que usam o Systemd, pode-se mascarar o target de Ctrl-Alt-Del com o
comando systemctl mask:

# systemctl mask -f ctrl-alt-del.target


Removed /etc/systemd/system/ctrl-alt-del.target.
Created symlink /etc/systemd/system/ctrl-alt-del.target →
/dev/null.

Desabilitar o uso de dispositivos de armazenamento USB

A última medida de segurança de inicialização é desabilitar o USB no Linux, de forma a


impedir que um dispositivo USB de armazenamento seja utilizado por um usuário comum.

A maneira de fazer isso é colocar o módulo do Kernel usb_storage no arquivo


/etc/modprobe.d/blacklist.conf de forma que não possa ser carregado automaticamente
pelo modprobe. Basta adicionar o nome do módulo com a tag blacklist ao final do arquivo:

# echo "blacklist usb-storage" >> /etc/modprobe.d/blacklist.conf

Desta forma, o módulo usb_storage não será carregado pelo kernel quando um dispositivo
usb de armazenamento foi plugado na máquina.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 439


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Métodos de Autenticação
O Linux suporta diversos métodos de autenticação de usuários além do tradicional usuário e
senha oferecido pelo PAM.

No modelo tradicional, o Linux mantém a sua própria base de usuários e senhas localmente,
consultando os arquivos /etc/passwd e /etc/shadow para promover a autenticação de
usuários. Não há nada de errado com isso, se você lida com seu próprio Desktop ou poucos
servidores.

Mas em ambientes corporativos, manter várias bases de usuários em diversos servidores e


muitas estações de trabalho pode ser uma bela dor de cabeça para os administradores e
usuários. Por isso o Linux suporta vários meios de centralizar a base de usuários e senhas, de
forma a centralizar a autenticação e gerenciamento de contas.

Keberos

O projeto Keberos surgiu no MIT com o objetivo de promover autenticação centralizada, com
apenas um único login (single sign-on) para acessar todos os recursos em qualquer servidor
na mesma rede.

O modelo criado pelo MIT, foi aprimorado e implementado como autenticação do Windows
2000, Windows Server 2003 e também pelo Mac OS X.

Este modelo se baseia em algo chamado confiança tripla, pois são necessários três agentes
distintos para promover a autenticação.

É necessário um Servidor de Autenticação (AS), que inicia o processo de login do usuário e


redireciona para um Servidor Distribuidor de Chaves (Key Distribution Center - KDC).

O KDC por sua vez ao receber a requisição do Servidor de Autenticação (AS), emite um ticket
critografado para o usuário. Desta forma, a combinação de usuário/senha não é enviada pela
rede a cada solicitação de login, mas sim o ticket criptografado.

Toda vez que o usuário for logar em um servidor ou aplicação que utilize o Keberos, o ticket é
apresentado ao terceiro elemento, o Serviço de Validação do Ticket (Ticket-Grating Service -
TGS).

O TGS determina então se o ticket é válido.

Se o ticket for válido, o servidor utiliza o programa kinit para guardar o ticket em um cachê.

O comando klist pode ser usado para ver uma lista dos tickets armazenados no cachê de
credenciais do servidor.

O Keberos somente centraliza o processo de autenticação, mas ainda assim necessita de


servidores para manter a base de dados de usuários e recursos.

LDAP

A autenticação centralizada pelo Keberos é parte do processo de centralização do


gerenciamento de usuários e recursos. Se usado em conjunto com o Lightweight Directory
Access Protocol - LDAP - a solução fica completa.
440 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

O LDAP fornece um Serviço de Diretório que mantém em um só local todas as contas de


usuários e recursos, como compartilhamento de armazenamento de disco, impressoras, etc.
Isto facilita muito a administração da rede, pois fica tudo centralizado. No LDAP pode-se ter
acesso a todos os dados dos usuários, quais recursos ele pode acessar, gerenciar a validade
de sua senha, etc. O serviço de LDAP funciona como a velha lista telefônica.

Outro ponto importante é que o LDAP pode ser distribuído em vários servidores pela rede,
inclusive através de múltiplos locais distintos, conectados por uma VPN. Desta forma, pode-
se obter uma administração centralizada e, ao mesmo tempo, distribuída.

A Microsoft fez uso da combinação Keberos+LDAP para criar o Active Directory.

No Linux também é possível criar uma solução bem parecida com os pacotes openldap e
krb5.

RADIUS

O Remote Authentication Dial-IN USer Service - RADIUS - é um serviço muito antigo de


autenticação de usuários, utilizado na década de 90, quando a Internet ainda era acessada
por conexões Dial-Up discadas com modem caseiros. De alguma sorte, este método ainda
pode ser utilizado para autenticação de conexões Wifi corporativas, como em grandes hoteis
e shopping centers.

TACACS+

O Terminal Access Controller Access-Control System (TACACS) também é um antigo método


de autenticação utilizado no Unix, e posteriormente, em alguns equipamentos de acesso à
rede. Era popular até a chegada do RADIUS.

Tem pelo menos 20 anos que não trabalho com nenhum destes dois protocolos.

Métodos de Autenticação Multifator


A moda agora parece ser a autenticação por multifator. Desta forma, o usuário necessita se
identificar, digitar uma senha (fator um), e oferecer um segundo fator de autenticação para
provar as suas credenciais.

Esse segundo fator pode ser uma coisa que só ele é, como, por exemplo, autenticação por
biometria, ou oferecer uma coisa que só ele tem, como um Token, ou Certificado Digital.

Biometria

Com o barateamento dos sensores biométricos e escalada do poder de processamento das


CPUs, é muito comum hoje encontrar a autenticação por biometria em computadores
pessoais e celulares, que são capazes de fazer a leitura de impressões digitais ou
reconhecimento facial.

A biometria sempre entra como um segundo fator de autenticação, pois o usuário no


primeiro login, tanto no computador ou no celular é obrigado a digitar a senha de
desbloqueio.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 441


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Nos caixas eletrônicos e ATMs, os bancos utilizam a combinação de cartão+senha+biometria


para autorizar saques em dinheiro e fazer transferências.

Tokens

Os tokens também são uma forma de autenticação por dois fatores bem satisfatória, pois
oferecem uma autenticação por uma coisa que somente o usuário deve deter. Pode ser um
Certificado Digital, uma chave privada, um dispositivo USB ou um chaveiro (hardware token)
que gera uma senha única a cada minuto.

O uso de token por software também é bem popular, através do Google Authenticator ou
Microsoft Authenticator, que funcionam nos aparelhos celulares e geram uma senha única
a cada minuto (OTP).

Os bancos também usam o token por software nos seus aplicativos de celulares, para
autenticar as transações realizadas.

O que importa é saber que o token oferece uma autenticação a mais, com uma coisa única
que somente o usuário pode ter.

PKI

A autenticação por Token pode ser ainda aprimorada através de uma cadeia de verificação
de certificados digitais através de uma infraestrutura de chaves públicas (PKI). Neste modelo,
o Token do usuário é também autenticado por uma entidade certificadora (CA), capaz de
atestar que aquele determinado certificado digital é autentico e válido. Essa estrutura é
utilizado no Brasil com o e-CPF e e-CNPJ.

Login sem senha

A estrutura do PKI também pode ser utilizada para autenticação sem senha, quando o
usuário utiliza uma chave privada para fazer a autenticação em um servidor que possua a
sua chave pública.

A Amazon AWS utiliza a autenticação sem senha por chaves para conceder acesso remoto
via SSH nas suas instâncias de computação EC2.

O acesso via ssh com chave privada pode ser feito utilizando a opção "-i" do ssh:

$ ssh -i chave.pem uiraribeiro@servidor.certificacaolinux.com.br

Restrição de Acesso Privilegiado


Uma boa prática de segurança é restringir o acesso à conta do super-usuário root, de forma
que esta seja utilizada minimamente no sistema.

Desta forma, é preferível que os administradores façam login no Linux com contas de usuário
pessoais e sem privilégio, e quando precisarem de acessar um recurso privilegiado, façam
uso do comando "sudo".
442 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

Isto também ajuda a saber o que cada usuário está fazendo no sistema, uma vez que cada
usuário utiliza a sua conta pessoal, e quando necessário, executa algo com as permissões do
root, se assim for o caso.

Isto permite que as ações no sistema sejam rastreadas em arquivos de log para posterior
auditoria, e com maior possibilidade de atribuir as pessoas suas ações.

Existem várias possibilidades de restringir o acesso da conta do root.

Restringir o acesso via ssh

A primeira ação é restringir o login do root via ssh. Para isto, deve-se editar o arquivo
/etc/ssh/sshd_config e alterar o parâmetro PermitRootLogin para "no". Feito isso, é
necessário reiniciar o serviço do sshd, com o comando "systemctl restart sshd".

Bloquear o acesso via Shell

Outra possíbilidade é restringir completamente o acesso via shell do root, uma vez que todo
o acesso privilegiado do sistema pode ser feito com os comandos "sudo" e "su" .

A maneira de fazer isso é alterando o shell no arquivo /etc/passwd do usuário root para
"/usr/sbin/nologin". Pode-se fazer alterando manualmente o arquivo passwd, ou utilizando
o comando usermod:

# usermod -s/usr/sbin/nologin root


$ cat /etc/passwd | grep root
root:x:0:0:root:/root:/usr/sbin/nologin

Desta forma, nem mesmo logar com a conta do root com o comando "sudo su" será possível:

$ sudo su -
[sudo] senha para uiraribeiro:
This account is currently not available.

Bloquear o acesso via Terminal

Se o arquivo /etc/securetty estiver vazio (mas precisa existir), o usuário root será impedido
de logar até mesmo via console.

Restrigindo aplicações com chroot


Uma boa prática de segurança é restringir uma aplicação a uma determinada estrutura de
diretório, impossibilitando que a aplicação consiga acessar outros arquivos fora do diretório
especificado.

O comando chroot é capaz de criar uma "jaula" para a aplicação, confinando-a em um


diretório que vai atuar como um diretório raiz virtual para a aplicação.

A sintaxe básica do chroot é:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 443


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

$ chroot novo_diretório_root programa

Desta forma, o chroot irá prender o programa dentro do diretório especificado, e todo o
acesso que o programa fará será relativo à aquele diretório, como se esse diretório fosse o
novo diretório raiz do sistema na perspectiva do programa.

O uso do chroot não é tão simples, uma vez que como o programa pensa que o diretório é o
raiz do sistema de arquivos, é necessário copiar para o diretório todos os arquivos e
bibliotecas que o programa necessita para executar.

Alterando o Banner do Sistema


Uma boa política de segurança é alterar os banners do sistema, de forma que sejam exibidos
avisos legais de acesso, ao invés da saudação normal do sistema.

O Linux possui duas saudações:

A primeira delas é mostrada ANTES do sistema solicitar o login do usuário. Ela é definida pelo
arquivo /etc/login.warn. É comum colocar aqui um aviso sobre como o acesso não
autorizado acarretará em sanções previstas em Lei, etc.

A segunda saudação é mostrada depois do Login bem sucedido, armazenada no arquivo


/etc/motd. O nome vem de "Message of the Day". O administrador pode colocar aqui
mensagens importantes de uso, avisos sobre manutenções, mudanças em recursos, etc.

Desabilitando Serviços não


Necessários

Uma importante tarefa do administrador é desabilitar os serviços desnecessários,


especialmente serviços de rede.

O primeiro passo, é verificar quais serviços estão em execução com o comando:

$ systemctl status

Esse comando exibe uma lista de todos os serviços em execução.

Pode-se ainda listar as portas abertas e os seus respectivos processos com os comandos
netstat ou ss:

# netstat -tunlp

ou

# ss -tunlp

444 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Para desligar os serviços desnecessários, usa-se o comando:

# systemctl stop nomedoservico

E para desabilitar no processo de carga do sistema:

# systemctl disable nomedoservico

Se a distribuição ainda usa o System V Init Daemon, os serviços em execução podem ser
vistos com o comando:

$ service --status-all

Ou com o comando:

$ chkconfig --list

Para parar os serviços, o comando pode ser utilizado:

# service nomedoservido stop

E para desabilitar:

# chkconfig nomedoservico off

Super Servidores
Um "super-servidor" ou às vezes chamado de "despachante de serviço" é um programa
especial que servia como um "porteiro" para que outros pudessem entregar serviços de rede
de forma segura.

Tradicionalmente há muitos e muitos anos, os serviços de telnet, ftp, hora utilizavam um


super-servidor chamado inetd para executar de forma segura. Então esse serviço chamado
inetd era responsável por atender a solicitação de rede, e repassar a conexão ao executável
apropriado, como o telnet ou ftp.

Depois de alguns anos, o super-servidor inetd evoluiu para oferecer mais funcionalidades, e
um novo pacote de software foi criado com o nome de xinet (eXtended inetd).

Esse novo super-servidor facilitou a configuração destes serviços de rede.

/etc/xinetd.conf

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 445


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

O principal arquivo de configuração do xinetd é o /etc/xinetd.conf. Este arquivo pode conter


configurações gerais, e faz um apontamento para o diretório /etc/xinetd.d.

/etc/xinetd.d

Este diretório contém arquivos separados para cada serviço que o xinetd provê como padrão:

$ ls -l /etc/xinetd.d
-rw-r--r-- 1 root root 640 Feb 5 2018 chargen
-rw-r--r-- 1 root root 313 Feb 5 2018 chargen-udp
-rw-r--r-- 1 root root 502 Feb 5 2018 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 telnet
-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

Por exemplo o arquivo de configuração do telnet:

service telnet
{
disable = no
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
no_access = 10.0.1.0/24
log_on_success += PID HOST EXIT
access_times = 09:45-16:15
}

Para desabilitar um serviço do xinet, pode-se:

Apagar a configuração do serviço do /etc/xinetd.d;


Trocar a configuração da variável disable para "yes". Depois disso, reiniciar o serviço
de xinetd;

446 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Já faz algum tempo que as distribuições não usam mais os "super


servidores" inetd e xinetd para prover serviços de rede, uma vez que os serviços também
nem são mais utilizados, como telnet, ftp e outros, por serem serviços sem criptografia. Muito
possivelmente, o pacote xinetd nem estará instalado como padrão, e é melhor assim.

Uso de Tcpwrappers
O tcpwrapper funciona como um porteiro que executa antes do serviço desejado no xinetd.
Assim, era possível limitar quais os endereços de rede clientes que podiam acessar
determinado serviço.

O tcpwrapper consulta os arquivos /etc/hosts.allow e /etc/hosts.deny para saber quais


endereços IP podem acessar qual serviço.

hosts.allow e hosts.deny

Os arquivos /etc/hosts.allow e /etc/hosts.deny são utilizados para definir regras de acesso


aos serviços oferecidos pelo superdaemon inetd.

O primeiro passo importante é desativar os serviços que não são necessários para o
funcionamento do sistema. Se não há necessidade de execução de nenhum serviço fornecido
pelo xinetd, ele deve ser desabilitado.

Se o uso destes serviços for inevitável, não utilize servidores de acesso remoto que
transmitem dados sem criptografia, como o telnet, rlogin, e rsh. Prefira utilizar o shell seguro
OpenSSH.

Quando uma conexão é estabelecida, o tcpwrapper lê primeiro o conteúdo do arquivo


/etc/hosts.allow. Se existir uma regra para esta conexão ele não checa o arquivo hosts.deny.

$ cat /etc/hosts.allow
telnet: 10.10.100.1

Se nenhuma regra for encontrada no hosts.allow, ele lê o /etc/hosts.deny à procura de uma


regra. Se for encontrada, ele termina a conexão. Se não for encontrada, ele libera o acesso.

Para contornar este tipo de situação, a regra “ALL:ALL” pode ser colocada no arquivo
/etc/hosts.deny para que somente as conexões explicitamente definidas pelas regras em
hosts.allow sejam aceitas.

Alterando as Portas Padrão


Uma alternativa de segurança usada para confundir e dificultar até certo ponto é mudar as
portas padrão de serviços sensíveis, como de ssh.

O arquivo /etc/services contém uma lista de portas TCP/UDP de 0 até 1023, que são
designações oficiais definidas pelo comitê Internet Assigned Numbers Authority (IANA) para
os serviços de rede mais populares.

Todos os sistemas operacionais seguem a lista oficial da IANA para definir as portas de 0 até

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 447


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

1023.

As portas de 1024 até 49.151 são registradas no IANA, mas não oficialmente designadas.

As portas acima de 49.152 até 65535 podem ser usadas por qualquer aplicação, geralmente
para tráfego ponto a ponto.

A maioria das aplicações define qual porta vai usar no seu próprio arquivo de configuração.
Outras já usam o /etc/services como referência. De qualquer forma, o importante ao mudar
um serviço de uma porta para outra, é importante também alterar no lado cliente.

Este tipo de estratégia funciona até certo ponto, pois um scan de rede simples como o nmap
pode ser capaz de descobrir os serviços, independente de qual porta estejam operando.

Restringindo acesso ao Cront e At


Também é importante restringir o acesso ao agendador de tarefas do Cron e do At, somente
para o administrador do sistema e alguns poucos usuários que realmente necessitem do
serviço.

Os arquivos /etc/cron.allow e /etc/cron.deny regulam as permissões de acesso ao cron. Estes


arquivos funcionam da mesma forma que o hosts.allow e hosts.deny.

Os arquivos /etc/at.allow e /etc/at.deny regulam as permissões de acesso ao serviço de at.

Se nenhum destes arquivos existirem, o acesso ao cron e at estão liberados para todos os
usuários.

Para restringir o acesso a estes serviços, é importante criar os arquivos cront.allow e at.allow
com somente o usuário root:

# echo "root" >> /etc/cron.allow


# echo "root" >> /etc/at.allow

Separação de Dados do Sistema e de


Aplicativo

A separação de dados do sistema e dados da aplicação é um recurso de segurança


relativamente simples.

Ao criar uma partição separada para dados do usuário ou aplicação, impede-se que um
usuário preencha todo o espaço em disco no sistema e interrompa o servidor.

Este esquema de separar os dados da aplicação em partição separada também permite que
se faça "snapshots" da partição. Isto facilita muito o backup e recuperação dos dados de
forma rápida e eficiente.

Os sistemas de arquivos BTRFS e LVM permitem criar cópias das partições (snapshots) com
448 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

muita facilidade.

Além disso, pode-se utilizar a criptografia de disco nesta partição utilizando o LUKS, de forma
a evitar que as informações possam ser roubadas em caso de acesso físico ao servidor ou
notebook

Além disso, pode-se ainda restringir o acesso ao disco dos aplicativos usando o comando
chroot, que impede que aplicativos acidentais ou mal-intencionados obtenham dados
usados por outros aplicativos.

Criptografia de Disco

A melhor maneira de proteger os dados é aplicar uma criptografia no disco, de forma que
mesmo que alguém tenha acesso físico ao hardware, não poderá fazer muita coisa.

Até o Windows utiliza uma criptografia chamada bitlocker para proteger os dados. A chave de
criptografia é atrelada a uma conta na Microsoft. Somente o dono da conta poderá acessar os
dados, seja através da sua senha ou de uma chave de criptografia.

O Linux também possui criptografia de disco, que funciona no nível do Kernel, e encripta
qualquer arquivo gravado na partição com a criptografia habilitada.

O Linux Unified Key Setup (LUKS) é o pacote padrão no Linux que faz a criptografia
funcionar.

Ele é composto de um módulo do Kernel chamado dm-crypt, que provê uma interface entre
o disco físico e o disco virtual criptografado criado no diretório /dev/mapper.

Ele também utiliza o comando cryptmount que cria o disco virtual ligado ao dm-crypt e
garante que todos os dados sejam criptografados antes de armazenados no disco físico.

No Ubundu/Debian este pacote pode ser instalado com o comando:

# apt install cryptsetup

No RedHat/CentOS/Fedora:

# yum install cryptsetup-luks

Para criptografar é necessário que o disco ou partição esteja vazio. O comando cryptsetup
prepara o disco para criptografia:

# cryptsetup luksFormat /dev/sdb


WARNING!
========

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 449


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

This will overwrite data on /dev/sdb irrevocably.


Are you sure? (Type uppercase yes): YES
Enter passphrase for /dev/sdb:
Verify passphrase:

O comando cryptsetup pede uma senha que é usada para abrir a criptografia. Se você
esquecer a senha, não será possível acessar os dados.

Depois de preparar a partição, ela deve ser mapeada como disco virtual:

# cryptsetup luksOpen /dev/sdb dados

O comando luksOpen cria o mapeamento de /dev/sdb para /dev/mapper/dados:

$ ls -l /dev/mapper/dados
lrwxrwxrwx 1 root root 7 Dec 30 12:55 /dev/mapper/dados ->
../dm-0

O comando cryptsetup status mostra o estado do disco criptografado:

# cryptsetup -v status dados


/dev/mapper/dados is active.
type: LUKS2
cipher: aes-xts-plain64
keysize: 512 bits
key location: keyring
device: /dev/sdb
sector size: 512
offset: 32768 sectors
size: 16744448 sectors
mode: read/write
Command successful.

Depois de criado o mapeamento, pode-se formatar o disco com o sistema de arquivos


preferencial:

# mkfs.ext4 /dev/mapper/dados
mke2fs 1.45.3 (14-Jul-2019)
Creating filesystem with 2093056 4k blocks and 523264 inodes
Filesystem UUID: 43bddd5c-4e2b-4df1-9b22-0f07557e0a66
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736,

450 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

1605632
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

Depois de formatado, o disco pode ser montado:

# mount /dev/mapper/dados /dados

Agora é só utilizar o disco normalmente. Após reinício é necessário abrir novamente o disco
com o cryptosetup:

# cryptsetup luksOpen /dev/sdb dados

Uma opção de elegante de não precisar digitar a senha para abrir a criptografia quando o
computador é reiniciado é criar uma chave em arquivo.

O primeiro passo é criar uma chave aleatória com o comando dd:

# dd if=/dev/urandom of=/root/keyfile bs=1024 count=4

Esse comando vai criar uma chave aleatória de 4096 bytes. O "dispositivo" /dev/urandom
gera uma sequencia de bytes aleatória. A saída do comando dd será o arquivo
/root/keyfile.

Depois para manter a chave segura, é bom alterar as permissões de leitura somente para o
root:

# chmod 0400 /root/keyfile

Feito isso, pode-se adicionar a chave recém criada ao disco criptografado:

# cryptsetup luksAddKey /dev/sdb /root/keyfile


Enter any existing passphrase:

O Luks vai solicitar a senha para adicionar a chave. Uma vez adicionada, ela pode ser
utilizada num arquivo especial chamado /etc/crypttab.

Deve-se então editar o arquivo /etc/crypttab, e incluir a seguinte linha:

dados /dev/sdb /root/keyfile luks

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 451


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Este arquivo vai fazer a abertura da criptografia com a chave /root/keyfile, e montar o disco
virtual em /dev/mapper/ com o nome de dados.

Por último, deve-se editar o /etc/fstab, para fazer a montagem do disco virtual
/dev/mapper/dados, e acrescentando a seguinte linha:

/dev/mapper/dados /dados ext4 defaults 0 0

O disco criptografado poderá ser acessado tanto com a senha, ou com a cheva
no /root/keyfile. De qualquer sortem, recomenda-se fazer um backup da chave em algum
lugar, e também anotar senha.

Monitoramento e Auditoria

Monitoramento da Distribuição
É importante manter o Linux atualizado com os últimos releases de pacotes, de forma que as
correções de bugs sejam corrigidas.

Cada distribuição mantém por um certo tempo o suporte da versão do Linux. Algumas
distribuições ainda são capazes de fazer o "upgrade de versão", utilizando o gerenciador de
pacotes.

O Ubuntu pode fazer o upgrade de versão com o comando:

# apt-get dist-upgrade

E fazer atualização dos pacotes no Ubuntu/Debian com o comando:

# apt-get update
# apt-get upgrade

As distribuições que usam o YUM, como o CentOS, RedHat, podem ter seus pacotes
atualizados com:

# yum update

E o Fedora com o comando:

# dnf update

452 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

E o OpenSuSe com:

# zypper update

Monitoramento CVE
O Departamento de segurança US Department of Homeland Security contratou uma
organização chamada MITRE para publicar informações de segurança, chamada de Common
Vulnerabilities and Exposures (CVE).

O MITRE mantém uma base de dados de vulnerabilidades no endereço


https://cve.mitre.org que pode ser consultada pelos administradores para verificar falhas.

Este tipo de publicidade faz com que as fabricantes de software se empenhem em resolver
os problemas rapidamente e ainda mantém os administradores informados. Na maioria das
vezes o MITRE divulga no CVE as possíveis soluções paliativas ou definitivas para sanar o
problema.

Auditoria
O Linux tem um sistema de Log bem completo, e pode ser usado para a maioria das estações
de trabalho.

Mas para servidores e máquinas de operação mais sensível, indica-se a instalação do pacote
auditd. Este pacote é capaz de fornecer uma auditoria no sistema com os seguintes dados:

Arquivos e Diretórios acessados pelos usuários;


Chamadas de Sistema feitas pelas aplicações
Comandos que os usuários executaram
Acessos de rede que os usuários fizeram
Acessos externos de rede

O pacote auditd pode ser instalado no Ubuntu/Debian com os comandos:

# apt install auditd

Ou no CentOS/Fedora/RedHat:

# yum install auditd

O principal arquivo de configuração do auditd é o /etc/audit/auditd.conf e o audit.rules


que define as regras.

Uma vez instalado, ele pode ser habilitado usando o comando systemctl:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 453


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

# systemctl start auditd

Os logs gerados pelo audit ficam no diretório /var/log/audit.

Uma documentação completa do projeto pode ser acessada


em https://github.com/linux-audit/audit-documentation/wiki

Destaco que auditoria consome recursos da máquina, tanto disco, CPU e memória. Deve ser
aplicada com propósito e cautela.

454 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Simulado
3.4 Serviços de LOG

Muitos eventos acontecem em um ambiente Linux. Vários deles precisam ser gravados em
um arquivo de histórico (LOG) para que um administrador possa verificar, posteriormente,
quando acontece um erro ou para efeitos de auditoria.

O Linux vários serviços que oferecem essa funcionalidade de registrar os eventos


importantes para consulta do administrador.

O mais antigo deles é o syslog, pouco utilizado. O sistema legado rsyslog é comum ser
encontrado ainda nas distribuições, e o mais utilizado na maioria das atualmente é o
Systemd Journal.

rsyslog
O rsyslog foi por muitos anos o serviço padrão de gravação de Logs do sistema. Seu trabalho
consiste em coletar mensagens do Kernel, de outros serviços e de aplicativos, e grava-los em
arquivos de log, enviá-los para outro serviço remoto de rsyslog, gravar em um banco MySql
ou PostgreSQL e também exibir mensagens urgentes no terminal.

Para facilitar a organização das informações, o rsyslog divide as mensagens em grupos e


também por severidade.

Sua instalação é simples, e pode ser feita através do gerenciador de pacotes:

# apt install rsyslog

Seu arquivo de configuração /etc/rsyslog.conf controla o que ele vai gravar e onde.

O rsyslog também trabalha com módulos, que são programas no estilo "plugin" que podem
habilitar novas funcionalidades ao syslog, tais como: envio de mensagens SNMP, uso do
MySQL, uso do PostgreSQL, outras bases de dados, etc.

O “o que” vai ser gravado é chamado de facilidade. As facilidades são, na verdade,


a origem das mensagens. Cada facilidade possui níveis de severidade. Os níveis de
severidade variam do grau de importância das mensagens.

As facilidades possíveis são:

auth: Mensagens de segurança/autorização;


authpriv: Mensagens de segurança/autorização (privativas);
cron: Daemons de agendamento de tarefas (cron e at);
daemon: Outros daemons do sistema que não possuem facilidades específicas;

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 455


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

kern: Mensagens do kernel;


lpr: Subsistema de impressão;
mail: Subsistema de e-mail;
news: Subsistema de notícias da USENET;
syslog: Mensagens internas geradas pelo syslogd;
user: Mensagens genéricas de nível do usuário;
local0 até local7: Reservados para uso local por outros programas que desejem
escrever seus logs no syslog.

Os níveis de severidade podem ser:

debug (7): Informações de debug (depuração);


info (6): Mensagens apenas para informação;
notice (5): Condições normais, mas significativas;
warning (4): Condições de alerta;
err (3): Condições de erro;
crit (2): Condições críticas;
alert (1): Ações imediatas são requeridas;
emerg (0): Sistema indisponível.

Para cada facilidade podemos especificar um nível de severidade, que vai definir o grau de
importância da mensagem. Quanto menor é o nível, maior a severidade. O nível 7 por
exemplo é o que mais gera informações para depuração de erros.

rsyslog.conf

O arquivo /etc/rsyslog.conf possui o seguinte formato:

facilidade.severidade ação

A ação especifica o que deverá ser feito com a mensagem. Pode ser um arquivo de LOG, um
PIPE (direcionado para um utilitário ou aplicativo), um outro sistema remoto, determinados
usuários ou todos os usuários e até um banco de dados relacional como o MySQL ou
PostgreSQL.

Desta forma, o rsyslog trabalha com o padrão de "sistema de filtros". Todas as mensagens
com o nível especificado e menores são registradas de acordo com as opções usadas.

Por exemplo, se você escolher gravar as mensagens vindas do kernel com nível crítico (2), as
mensagens de alerta (1) e emergência (0) também serão gravadas.

Também é possível que conjuntos de facilidades e níveis possam ser agrupados, separando-
as por ponto-e-virgula “;”.

As ações podem ser do tipo:

456 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Ação Descrição

Arquivo As mensagens são gravadas em arquivos no sistema. O arquivo precisa ser especificado
com o caminho completo, começando pela raiz do sistema com uma “/”. Para ganhar
performance, você deverá preceder o nome do arquivo com o sinal menos “-“. Isso evita
que o syslog grave diretamente no disco a cada inclusão e utilize um buffer. Mas se o
sistema travar antes da escrita em disco, a mensagem será perdida.

PIPE "|" As mensagens são enviadas para um arquivo especial chamado file descriptor. Este
arquivo é uma memória em disco (FIFO) que outros programas podem ler. Para utilizar o
PIPE, devemos preceder seu nome pelo símbolo “|” e criar o PIPE com o comando mkfifo.

Terminal e Podemos especificar uma tela local do computador (console) através do caminho
Console /dev/console ou um terminal remoto tty para onde as mensagens serão enviadas.

Computador Podemos enviar as mensagens do syslog para uma máquina remota precedendo a ação
Remoto com o símbolo “@” seguido do nome do host. Em questões de segurança, enviar as
mensagens para outra máquina pode ser especialmente importante.

Usuários Podemos especificar um determinado usuário ou uma lista de usuários (separado por
vírgulas) para onde as mensagens serão enviadas no terminal quando estes estiverem
logados no sistema.

Em algumas distribuições o rsyslog pode dividir seu arquivo de log em vários arquivos no
diretório /etc/rsyslog.d para facilitar a organização:

$ ls -l /etc/rsyslog.d
-rw-r--r-- 1 root root 314 Aug 15 2017 20-ufw.conf
-rw-r--r-- 1 root root 1124 Mar 7 2019 50-default.conf

Esses arquivos podem ter qualquer nome, desde que tenham a extensão .conf. O numeral
na frente do nome serve para ordernar a ordem de leitura da configuração pelo rsyslog.

Veja o conteúdo do arquivo 50-default.conf:

$ cat 50-default.conf | grep -v "#"


auth,authpriv.* /var/log/auth.log
*.*;auth,authpriv.none -/var/log/syslog
kern.* -/var/log/kern.log
mail.* -/var/log/mail.log
mail.err /var/log/mail.err
*.emerg :omusrmsg:*

Neste exemplo, à esquerda do arquivo são exibidos as facilidades do log e separado por
tabulação o destino, que pode ser um arquivo.

Existem ainda quatro caracteres que garantem funções especiais: “*”, “=”, “!” e “-”:

“*” - Todas as mensagens da facilidade especificada serão redirecionadas.


“=” - Somente o nível especificado será registrado.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 457


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

“!” - Todos os níveis especificados e maiores NÃO serão registrados.

Os caracteres especiais “=” e “!” podem ser combinados em uma mesma regra.

O diretório padrão dos arquivos de log mantidos pelo rsyslog é o /var/log.

Veja abaixo outros exemplos do rsyslog.conf

Imprime no terminal as mensagens críticas:

kern.warning;*.err;authpriv.none /dev/tty10
kern.warning;*.err;authpriv.none |/dev/xconsole
*.emerg *

Envia alertas imediatos ao usuário root quando este estiver logado:

*.alert root

Envia mensagens do sistema de e-mail:

mail.* -/var/log/mail
mail.info -/var/log/mail.info
mail.warning -/var/log/mail.warn
mail.err /var/log/mail.err

Envia as mensagens críticas para um arquivo e também para outro servidor:

*.=warning;*.=err -/var/log/warn
*.crit /var/log/warn
*.crit @servidor02

A seguir uma tabela com os principais arquivos de LOG e seus propósitos que podem estar
configurados no sistema de Log. Cada distribuição pode ou não fazer uso deles.

Arquivo Propósito

/var/log/messages Este arquivo contém Logs genéricos do sistema, com informações não críticas.

/var/log/secure Este arquivo contém os eventos de autenticação, como logins usando sudo e ssh e outros
serviços de segurança.

/var/log/kern.log Este importante arquivo de Log armazena informações de eventos do Kernel, como erros
e avisos, bem como problemas relacionados ao hardware e conectividade.

458 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Arquivo Propósito

/var/log/wtmp Mantém uma lista dos últimos logins dos usuários.

O comando lastb serve para ler o conteúdo do arquivo wtmp, fornecendo uma lista dos
usuários que se conectaram, como um livro de visitas:

# lastb
uiraribe ssh:notty 10.211.55.2 Sat Dec 28 16:01 - 16:01
(00:00)
uiraribe ssh:notty 10.211.55.2 Sat Dec 29 15:59 - 15:59
(00:00)

O exame requer que você tenha a noção da existência de outros dois sistemas de Logs:
syslog e o syslog-ng.

syslog
O syslog é um utilitário utilizado para enviar mensagens de LOG muito parecido com o
rsyslog, mas sem trabalhar com módulos ou banco de dados. Ele também trabalha com as
facilidades, severidades e ações, mas limitado a arquivos e servidores remotos. Ele foi
substituído pelo rsyslog que é sua versão aprimorada.

syslog-ng
Com o syslog-ng (Syslog Next Generation) é possível coletar logs de qualquer origem,
processá-los em tempo real e entregá-los a uma grande variedade de destinos. O syslog-ng
permite coletar, analisar, classificar, reescrever e correlacionar logs de forma flexível de toda
a sua infraestrutura e armazená-los ou roteá-los para ferramentas de análise de log. Ele
possui interface Web, com pesquisa rápida e também avisos de alerta por tipo de conteúdo.

logger
# logger [-DSI] [-f arquivo] [-pri p] [-t tag] [-socket u]
[Mensagem ... ]

O Linux possui um utilitário para enviar mensagens para o rsyslogd chamado logger. Essa
ferramenta é útil para o administrador utilizar em seus scripts, de forma a enviar uma
informação importante sobre algum evento para o sistema de Log.

As opções mais comuns são:

-i: Opera em modo interativo, de forma que as linhas são digitadas na console;
-s: Faça a seguinte mensagem de erro padrão, bem como o registro do sistema;
-f arquivo: Processe o arquivo especificado;

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 459


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

-p pri: Informe a mensagem com a prioridade especificada. A prioridade pode ser


indicada numericamente ou como um par “facility.level”. Por exemplo, “-p local3.info”
registra a mensagem como nível de informações na instalação local3. O padrão é
“user.notice”.

Os nomes de facilidades são: auth, cron, daemon, ftp, kern, lpr, mail, news, security, syslog,
user, uucp, e local0 até local7.

Os níveis válidos são: alert, crit, debug, emerg, err, error, info, notice, panic, warning, warn.

Exemplos:

# logger –p user.info “o usuário uribeiro ativou o circuito 3 da


segurança”

O logger então envia a mensagem para o rsyslog, que grava em /var/log/messages:

# tail /var/log/messagens
Out 22 19:25:34 linux-7rxb root: .p user.info o usuário uribeiro
ativou o circuito 3 da segurança.

Rodízio de Logs com Logrotate

Uma vez que os LOGs podem crescer demasiadamente e se tornar grandes arquivos, faz-se
necessário rotacionar os arquivos de log através de um rodízio. O utilitário que tem essa
função é o logrotate.

Ele pode ser instalado facilmente com qualquer gerenciador de pacotes:

# apt install logrotate

O utilitário logrotate é usado para fazer cópias de segurança dos arquivos de LOG atuais do
sistema. Ele copia e compacta os arquivos de LOG e cria novos arquivos. Esta rotação dos
arquivos proporciona maior organização e agilidade quando precisamos encontrar algum
detalhe útil, organizado por datas.

Ele não é um programa que fica residente na memória como um serviço. A sua execução é
feita pelo CRON, geralmente no diretório de scripts do Cron diário em
/etc/cron.daily/logrotate.

logrotate.conf

A rotação dos arquivos de LOG é feita de acordo com o tamanho do arquivo de logs

460 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

especificado, mas a opção -f pode ser usada para “forçar” a rotação de logs. A opção -d
fornece mais detalhes sobre o que o logrotate está fazendo. Seu arquivo principal de
configuração é o /etc/logrotate.conf.

Da mesma forma que outros programas, o logrotate divide o arquivo de configuração em


vários arquivos no diretório /etc/logrotate.d:

$ ls -l /etc/logrotate.d
-rw-r--r-- 1 root root 160 Nov 12 2018 chrony
-rw-r--r-- 1 root root 112 Feb 24 2019 dpkg
-rw-r--r-- 1 root root 501 Mar 7 2019 rsyslog
-rw-r--r-- 1 root root 178 Aug 15 2017 ufw
-rw-r--r-- 1 root root 145 Feb 19 2018 wtmp

Exemplo de configuração do logrotate em /etc/logrotate.conf:

# roda os arquivos de log semanalmente


weekly
# mantém as últimas 4 cópias de logs anteriores
rotate 4
# Cria novos arquivos de log (vazios) após rodar os antigos
create
# Para compactar arquivos de logs compactados.
compress
# Inclusão de outras configurações:
include /etc/logrotate.d

Quando o número máximo de logs mantidos pela opção rotate [num] é atingida, os logs
eliminados serão enviados para o usuário especificado na opção mail [email]. A utilização da
diretiva nomail evita isso.

Veja o exemplo de um arquivo de configuração do log do chrony no /etc/logrotate.d:

$ cat /etc/logrotate.d/chrony
/var/log/chrony/*.log {
postrotate
/usr/bin/chronyc cyclelogs > /dev/null 2>&1 || true
endscript
}

Neste exemplo o logrotate fará o rodízio do log do chrony no diretório /var/log/chrony/ e


executará um comando após o rodízio dos logs.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 461


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Journal do Systemd

Uma das grandes vantagens do Systemd é a grande capacidade de registrar em Log aquilo
que acontece com os processos e serviços do sistema. Ele permite centralizar os arquivos de
Log dos diversos serviços, facilitando a leitura e interpretação deles.

O sistema que centraliza e gerencia estes logs do systemd é conhecido como journal. Este
journal é implementado pelo serviço journald que organiza todas as mensagens de log do
kernel, processos e serviços do usuário, como initrd, etc.

Um Journal segue o conceito de arquivo circular. Ele tem um tamanho determinado, e


quando atinge esse tamanho, ele vai apagando os registros velhos para incluir novos
registros.

A ideia é que as mensagens vindas de diferentes pontos do sistema e diferentes serviços seja
organizada e armazenada em arquivos binários de log chamados de journal. Deste forma, as
mensagens podem ser filtradas e mostradas em diferentes formatos, desde texto simples ou
em forma de objeto JSON para criar um gráfico.

O journal geralmente é armazenado no diretório /var/log/journal.

journalctl
O comando journalctl pode ser utilizado para ler o journal. Quando nenhum parâmetro for
informado, o journalctl mostra o log do systemd, de forma paginada (geralmente utilizando o
comando less):

$ journalctl
-- Logs begin at Mon 2019-04-22 22:15:28 -03, end at Tue
2019-10-22 02:34:11 -03. --
Apr 22 22:15:28 ubuntu kernel: Linux version 5.0.0-13-generic
(buildd@lcy01-amd64-020) (gcc version 8.3.0 (Ubuntu
8.3.0-6ubuntu1)) #14-Ubun
Apr 22 22:15:28 ubuntu kernel: Command line:
BOOT_IMAGE=/boot/vmlinuz-5.0.0-13 root=/dev/sda1

O journalctl também permite filtrar por datas:

$ journalctl --since “2019-10-01 17:12:00”

ou

$ journalctl --since yesterday

462 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Também é possível filtrar por Unit (unidade de serviço do systemd):

$ journalctl –u nginx.service

Ainda, filtro por componente Path

$ journalctl /bin/bash

Ou mostrar os registros recentes:

$ journalctl –n

E até mostrar os logs enquanto são gravados:

$ journalctl –f

A opção -p permite filtrar a prioridade do alerta:

$ journalctl -p alert

A prioridade do journal segue o mesmo padrão do rsyslog: "emerg" (0), "alert" (1), "crit" (2),
"err" (3), "warning" (4), "notice" (5), "info" (6), "debug" (7).

Para ver a quantidade de disco que o journal está consumindo:

$ journalctl --disk-usage
Archived and active journals take up 104.0M in the file system.

systemd-cat
Similar ao logger, o journal também possui uma ferramenta capaz de enviar mensagens para
o Journal. Este tipo de ferramenta é últil para o administrador enviar algo importante para o
sistema de Log, especialmente usado nos scripts de administração e manutenção do
sistema.

O seu funcionamento é bastante simples, recebendo mensagens na entrada padrão:

$ echo 'hello world' | systemd-cat

A mensagem pode ser visualizada com a opção -f do journalctl:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 463


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

$ journalctl -f
Oct 22 04:48:36 ubuntu cat[4513]: hello world

É possível também especificar um identificador com a opção "-t" para facilitar o filtro, e
também uma severidade com a opção "-p":

$ echo 'Emergencia!' | systemd-cat -t MeuPrograma -p emerg


uiraribeiro@ubuntu:~$
Broadcast message from systemd-journald@ubuntu (Tue 2019-10-22
04:49:56 -03):
MeuPrograma[4516]: Emergencia!

Neste caso, o sistema até fez um alerta no terminal, além de gravar em vermelho no Log:

$ journalctl -f
Oct 22 04:49:56 ubuntu MeuPrograma[4516]: Emergencia!

journald.conf
O arquivo de configuração /etc/systemd/journald.conf pode ser utilizado para limitar a
quantidade de espaço que o journal pode consumir.

Algumas opções importantes deste arquivo são pauta da prova, tais como o armazenamento
do journal e também seu tamanho.

Storage

Esta opção do journald.conf determina onde como o jornal será armazenado. Os valores
podem ser "volatile", "persistent", "auto" e "none".

Se for configurado como "volatile", os dados do journal serão armazenados somente em


memória, geralmente em um arquivo de memória especial no diretório /run/log/journal.

Se for configurado como "persistent", os dados serão gravados em disco, preferencialmente


no diretório /var/log/journal, com cópia em memória no diretório /run/log/journal enquanto
o disco raiz não está no estado de gravação no processo de boot do computador.

Se for configurado como "auto", o resultado é similar ao "persistent", mas irá gravar no
diretório /var/log/journal somente se esse existir. Senão todos os dados serão descartados.

A opção "none" desliga a gravação, descartando todos os logs.

O padrão é "auto".

Tamanho

As diretivas SystemMaxUse, SystemKeepFree, SystemMaxFileSize, SystemMaxFiles,


RuntimeMaxUse, RuntimeKeepFree, RuntimeMaxFileSize e RuntimeMaxFiles
464 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

definem o tamanho do journal.

As diretivas que começam com o prefixo "System" se aplicam ao Journal quando este está
armazenado na disco, de maneira persistente, geralmente no diretório /var/log/journal. Já as
diretivas que começam com o prefixo "Runtime" se aplicam ao jornal quando este está
armazenado na memória, especificamente em /run/log/journal.

Desta forma, as diretivas SystemMaxUse e RuntimeMaxUse controlam o tamanho


máximo de disco ou memória que o journal pode consumir.

As diretivas SystemKeepFree e RuntimeKeepFree controlam quanto de disco o systemd-


journald deverá deixar para outros programas.

As diretivas SystemMaxFileSize e RuntimeMaxFileSize controlam o tamanho máximo dos


arquivos individuais do journal, determinando a granularidade dos arquivos e influência o
rodízio dos logs.

Limpeza de Logs Antigos


A opção --vacuum-size limpa os logs antigos do Journal até que os arquivos atingam o
tamanho abaixo do tamanho especificado:

# journalctl --vacuum-size=10M
Deleted archived journal
/var/log/journal/de5040dbad4c124db4379433293750ce/system@95939d1d
9f0d4e43a7301a6fb64005fe-0000000000000001-00058728520be076.journa
l (16.0M).
Deleted archived journal
/var/log/journal/de5040dbad4c124db4379433293750ce/user-1000@3f9f2
a6a495e4f1eb3fa38eaf1f13f2f-00000000000010ae-0005872ed269843f.jou
rnal (8.0M).

A opção --vacuum-time limpa os logs anteriores a uma determinada data:

# journalctl --vacuum-time=1week
Deleted archived journal
/var/log/journal/de5040dbad4c124db4379433293750ce/system@95939d1d
9f0d4e43a7301a6fb64005fe-00000000000036d5-00058893e1031dfb.journa
l (8.0M).
Vacuuming done, freed 8.0M of archived journals from
/var/log/journal/de5040dbad4c124db4379433293750ce.

A opção --vacuum-files restringe o número de arquivos do Jornal até o número especificado,


diminuindo a granularidade, permitindo um melhor gerenciamento da rotação dos logs.

# journalctl --vacuum-files=5

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 465


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Vacuuming done, freed 0B of archived journals from


/var/log/journal/de5040dbad4c124db4379433293750ce.

Acesso ao Jornal sem o Systemd


Um caso peculiar é o acesso ao Jornal sem o Systemd funcionando. Isto acontece em
situações de manutenção e recuperação de dados, quando um sistema é reiniciado em modo
de emergência, ou pior, quando o disco raiz é montado com um Pendrive ou em outro
computador para reparos.

Este acesso somente é possível quando o Jornal estava em modo persistente, com os logs
gravados em /var/log/journal.

Para acessar o journal em modo de recuperação, pode-se usar a opção --file do journalctl:

$ journalctl --file /var/log/journal/$(cat /etc/machine-


id)/system.journal
-- Logs begin at Sat 2019-10-19 14:33:50 -03, end at Tue
2019-10-22 04:01:18 -03. --
Oct 19 14:33:50 ubuntu systemd[1]: Starting Discard unused blocks
on filesystems from /etc/fstab...
Oct 19 14:33:50 ubuntu systemd[1]: Starting Rotate log files...
Oct 19 14:33:50 ubuntu fstrim[14891]: /: 337.5 MiB (353882112
bytes) trimmed on /dev/sda1

Observe que a saída do comando "cat /etc/machine-id" é fornecida como caminho para o
Journal.

Interação do rsyslog com o jounal do systemd


Em alguns casos são interessantes a interação do rsyslog com o Journal, como, por exemplo,
para criar mensagens estruturadas e armazená-los num banco de dados de arquivos como o
MySql.

Uma interface de comunicação para esta cooperação é fornecida por módulos de entrada e
saída no lado do Rsyslog e pelo socket de comunicação do Jornal.

No lado do rsyslogd deve-se usar o módulo imjournal como um modo de entrada padrão
para arquivos de diário. Com este módulo, a importação será dos das mensagens e dos
dados estruturados fornecidos pelo journald.

Como alternativa, também é possível configurar o rsyslogd para ler a partir do socket
fornecido pelo Journal como uma saída para aplicativos baseados em syslogd. Em
comparação com imjournal, a entrada de soquete oferece atualmente mais recursos, como
vinculação de conjunto de regras ou filtragem.

466 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Simulado
3.5 Implementar e Configurar os
Firewalls do Linux

O termo Firewall serve para designar uma solução de segurança, baseada em software ou
hardware, ou os dois (chamamos isso de Appliance) que tem como objetivo analisar o tráfego
de rede, e com base de um conjunto de regras, permitir ou não que os pacotes sigam
caminho.

Existem basicamente dois tipos de Firewall e sua classificação depende de qual camada do
Modelo TCP/IP ele opera:

Figura 44 - Modelo TCP/IP - Camadas e Protocolos

A maioria dos Firewalls trabalham no modelo de Controle de Acesso, atuando nas camadas
de Transporte (TCP/UDP) e Internet (IP/ICMP).

O outro tipo de Firewall trabalha na camada de Aplicação, examinando o conteúdo do pacote,


e averiguando se ele pode ou não chegar até a aplicação, baseando-se em padrões de
conteúdo para determinado se algo é normal ou malicioso. Por exemplo, o Servidor Web

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 467


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Apache tem um Firewall de aplicação chamado Modsecurity que examina toda requisição
web entre o navegador e o servidor web.

O Linux trabalha muito bem com o Firewall de Controle de Acesso, com filtros integrados
diretamente ao Kernel do sistema.

Um Firewall de Controle de Acesso é capaz de liberar ou não o tráfego de um pacote


baseando-se em regras com as informações disponíveis das camada de Transporte e
Internet:

Informação Descrição

Endereço de Origem Endereço IP de Origem do Pacote. Pode ser um endereço IP, uma subrede ou todas a
Internet.

Endereço de Destino Endereço de Destino IP do Pacote. Pode ser um endereço IP, uma subrede ou todas a
Internet.

Protocolo de Rede Protocolo utilizado. Pode ser TCP, UDP, ICMP, RTP, RSVP, IGMP, IPSec, etc.

Porta de Origem Porta de serviço na origem. Pode ser uma porta específica ou um conjunto de portas.

Porta de Destino Porta de serviço no destino. Pode ser uma porta específica ou um conjunto de portas.

Estado da Conexão SYN-SENT, SYN-RECEIVED, ESTABLISHED, TIME-WAIT, etc. Dependendo do protocolo de


transporte é possível escrever regras específicas para estados de conexão diferentes.

As regras do Firewall de Controle de Acesso são baseadas nas informações acima.

O trabalho do Firewall é examinar os pacotes, e verificar se eles se encaixam nas regras que
ele tem. Uma vez que o Firewall encontrou um pacote que se enquadra nas regras, é
necessário definir o que o Firewall fará com o pacote. As ações que ele pode tomar são:

Ação Descrição

ACCEPT Aceita o pacote, deixando ele seguir o seu caminho até o destino.

REJECT Rejeita o pacote, mas avisa o emissor que o pacote foi rejeitado. Isto pode fazer com que o emissor
pare de emitir pacotes.

DROP Simplemente apaga o pacote e não avisa ninguém. O emissor pode ficar tentando conexão por um
longo tempo.

LOG Escreve em um LOG sobre a passagem do pacote, independente se ele foi aceito, rejeitado ou
apagado.

Cada regra do firewall precisa ter uma ação. As ações são escritas em letras maúsculas.

É importante em um Firewall criar regras para registrar o LOG, de forma ser possível auditar
as conexões em rede. Pode-se fazer um LOG dos pacotes que são rejeitados ou descartados,
e também fazer o LOG dos pacotes que foram aceitos em serviços privilegiados, como o ssh.

O firewall pode operar de duas maneiras: Sem estado de conexão (stateless) ou com
registro do estado de conexão (stateful):

468 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Modo de Operação Descrição

stateless • É mais simples e antigo;


• Mais rápido que o stateful;
• Olha cada pacote para decidir baseado em regras o que deve fazer;
• Não se importa com o estado da conexão;
• Não olha padrões de dados;
• Não olha fluxos de dados;
• As regras são estáticas;
• Ideal para grandes fluxos de dados;
• Precisa reiniciar quando uma regra é alterada.

stateful • Olha as conexões ponta a ponta;


• Registra o estado da conexão na memória;
• Implementa túneis;
• Implementa criptografia;
• Sabe se um pacote foi fragmentado;
• Não precisa reiniciar quando uma regra é alterada.

A maioria dos firewalls implementa algumas características da metodologia stateful.

O firewall trabalha com três tabelas: filter, nat e mangle:

Ação Descrição

filter Filtra os pacotes baseado em regras. É a tabela básica de um firewall.

nat Network Address Translation. Utilizada para alterar algum dados do cabeçalho do pacote. Altera o
endereço de origem, destino ou portas. É comum para fazer a tradução de endereços IP de uma
rede para outra rede. Muito utilizado para traduzir endereços IP privados em endereços IPs válidos
na Internet.

mangle Faz alterações especializadas nos pacotes.

Na tabela de FILTER, o firewall trabalha com três fluxos de dados. Os fluxos são chamados
de Chain:

Fluxo (Chain) Descrição

Input São os pacotes recebidos pelo Firewall, e destinados à algum serviço de algum programa
executado no firewall.

Forward São os pacotes que passam pelo Firewall, não originam no firewall e não tem como destino o
firewall. É a maior parte do fluxo de dados de um firewall.

Output São os pacotes que saem do Firewall, portanto, são originados de programas executados no
Firewall.

Para cada fluxo de dados, o firewall pode trabalhar com duas políticas:

Política Descrição

ACCEPT Nesta política o firewall trabalha de modo permissivo. Isto significa que ele vai aceitar todos os
pacotes que não se enquadram nas regras. Ele trabalha com uma lista de regras com ações reject
e drop.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 469


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Política Descrição

DROP Nesta política o firewall trabalha de modo paranóico. Isto significa que ele vai aceitar APENAS os
pacotes que se enquadram nas regras e descartar o resto. Ele trabalha com uma lista de regras
com ações accept.

É preciso escolher a política de cada chain antes de escrever as regras, pois a política influi
diretamente se as regras terão ações predominantemente accept ou drop/reject.

Na tabela de NAT, o firewall trabalha com três fluxos de dados:

Fluxo (Chain) Descrição

prerouting Altera algum dado do cabeçalho do pacote quando ele entra no Firewall.

input Altera algum dado do cabeçalho de pacotes destinados a algum programa local.

postrouting Altera algum dado do cabeçalho do pacote quando ele sai do Firewall.

É importante conhecer as portas e os serviços associados a elas, consultando o arquivo


/etc/services.

Netfilter
O netfilter é um módulo do Kernel do Linux capaz de capturar os pacotes de rede para
oferecer as funções de Filtro, Nat, Log e Mangle dos dados que trafegam nas interfaces de
rede.

Figura 45 - netfilter

Existem basicamente duas ferramentas que podem ser utilizadas para configurar e gerenciar
o Netfilter: iptables e firewalld.

iptables
iptables [opções] [chain] [regras]

O iptables foi a primeira ferramenta criada para criar, alterar e apagar regras de firewall no
netfilter.

470 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Suas opções mais comuns são:

Opção Descrição

-L [chain] Lista as regras das chains. Pode-se especificar uma chain. Se nenhuma tabela for
especificada, usa a tabela filter.

-t tabela Especifica qual é a tabela que será usada: filter, nat ou mangle. Se não for
especificado, irá usar a tabela filter.

-S [chain] Lista os detalhes das regras. Pode-se especificar uma chain.

-P chain política Especifica qual será a política de uma chain: ACCEPT ou DROP.

-A chain regra Adiciona uma regra ao final da chain.

-I chain indice regra Adiciona uma regra em determinada posição.

-D chain regra Apaga uma regra determinada.

-R chain indice regra Troca uma regra em uma determinada posição por outra.

-F [chain] Limpa toda as regras. Equivalente a apagar tudo. Pode-se especificar uma chain.

As regras no iptables podem ser escritas com as seguintes opções:

Opção Descrição

-d endereço Determina o endereço de destino de um pacote.

-s endereço Determina o endereço de origem de um pacote.

-i interface Determina que os pacotes tem origem pela interface indicada.

-o interface Determina que os pacotes saem pela interface indicada.

-p protocolo Determina que o pacote precisa usar o protocolo indicado (tcp, udp, icmp).

-j ação Aplica uma determinada ação para o pacote (ACCEPT, DROP, REJECT ou LOG).

--dport X Determina a porta de destino.

--sport X Determina a porta de origem.

O estado inicial do iptables é configurar todas as chains da tabela filter com nenhuma regra
com a política ACCEPT. Isto significa que todos os pacotes são aceitos.

As regras devem ser escritas numa sequência lógica. Se um pacote se enquadra numa regra,
ele é liberado, e não passa pelas demais regras.

# iptables -L
Chain INPUT (policy ACCEPT)
Chain FORWARD (policy ACCEPT)

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 471


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Chain OUTPUT (policy ACCEPT)

O primeiro passo para configurar um firewall com o netfilter é determinar se o firewall vai
restringir o acesso a tudo e liberar somente aquilo explicitamente aceito (Política DROP), ou
liberar tudo que não se enquadrar como não aceito (Política ACCEPT).

Os firewalls que são mais restritivos com política DROP são mais seguros.

Para exemplificar, vamos criar um firewall com as seguintes características:

1. Uma placas de rede enp0s5 ligada à Internet, com IP estático válido;


2. Uma placa de rede enp0s6 ligada à rede local, com IP estático privado
192.168.15.67/24;
3. O Firewall aceita apenas conexão SSH vindo da rede local local;
4. O Firewall deixa os usuários da rede local acessarem a Internet com HTTP e HTTPS;
5. O Firewall deixa os usuários da rede local acessarem suas caixas postais externas
IMAPS e SMTPS;
6. O Firewall não aceita conexões provenientes da Internet para a rede local.

O primeiro passo para essa configuração é mudar a política das chains INPUT, OUTPUT e
FORWARD para DROP. Com isso apenas os pacotes que se enquadrarem em alguma regra
serão permitidos:

# iptables -P INPUT DROP


# iptables -P FORWARD DROP
# iptables -P OUTPUT DROP

O segundo passo é liberar o encaminhamento de pacotes no Kernel com o comando:

# sysctl -w net.ipv4.ip_forward=1

Para tornar o encaminhamento permanente, é importante adicionar o ipforward no arquivo


/etc/sysctl.conf:

# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf

Para encaminhamento de pacotes do IPv6, o comando é:

# sysctl -w net.ipv6.conf.all.forwarding=1

E no arquivio /etc/sysctl.conf:

# echo "net.ipv6.conf.all.forwarding=1" >> /etc/sysctl.conf

472 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

O terceiro passo é escrever as regras:

Para liberar a entrada de conexões SSH do rede local, cria-se duas regras:

# iptables -A INPUT -s 192.168.15.0/24 -i enp0s6 -p tcp -d


192.168.15.67/32 --dport 22 -j ACCEPT

Essa primeira regra irá:

Trabalhar na Chain INPUT, pois permite que pacotes entrem para o serviço de ssh do
firewall.
Com a opção "-s 192.168.15.0/24" ela permite que somente pacotes vindos de IPs
da rede local.
Para reforçar, só permite pacotes vindos da interface de rede Ethernet da rede local
com "-i enp0s6".
A opção "-p tcp" determina que os pacotes sejam do tipo TCP.
A opção "--dport 22" determina que seja para a porta 22, que é a porta padrão do
ssh.
A Opção "-j ACCEPT" diz que o pacote será aceito.

É preciso também criar uma regra para os pacotes saírem do serviço de SSH:

# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

Este regra usa a chain OUTPUT, já que se trata de pacotes que vão sair do processo sshd
em execução no Firewall. Ainda, são pacotes do tipo TCP "-t tcp", com a porta de origem 22
"--sport 22" e terão ação "-j ACCEPT".

O iptables é sensível a caracteres maiúsculos e minúsculos. Então os nomes de chains e


ações precisam ser em letras maiúsculas.

Logo em seguida é importante liberar a resolução de nomes do serviço de DNS, que usa as
portas 53 e 5353 UDP. Liberou-se os pacotes de resolução de nomes nas chains INPUT e
OUTPUT (para resolução local de DNS), e na chain FORWARD, para que as máquinas da rede
local possam resolver nomes também:

# iptables -A INPUT -p udp --sport 5353 -j ACCEPT


# iptables -A INPUT -p udp --sport 53 -j ACCEPT
# iptables -A INPUT -p udp --dport 53 -j ACCEPT
# iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
# iptables -A OUTPUT -p udp --sport 53 -j ACCEPT
# iptables -A FORWARD -p udp --dport 53 -j ACCEPT

Opcionalmente, pode-se liberar os pacotes ICMP para liberar o PING. Novamente, usou-se a

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 473


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

chain INPUT e OUTPUT para que o firewall possa enviar e receber pacotes ICMP, e também a
chain FORWARD, para que as máquinas locais possam também usar o PING:

# iptables -A INPUT -p icmp -j ACCEPT


# iptables -A OUTPUT -p icmp -j ACCEPT
# iptables -A FORWARD -p icmp -j ACCEPT

É possível ser mais específico ao delimitar o tipo de pacote ICMP, para liberar somente o
PING delimitando o tipo de ICMP para ECHO e ECHO-REQUEST.

Agora deve-se liberar os pacotes vindos da rede local para acessar as págias web HTTP (80)
e HTTPS (443):

# iptables -A FORWARD -i enp0s6 -p tcp --dport 80 -j ACCEPT


# iptables -A FORWARD -i enp0s6 -p tcp --dport 443 -j ACCEPT

Pode-se liberar também os pacote para acessar os serviços de caixa postal externa (ex.
GMail). Este serviço costuma usar o IMAP+SSL na porta 993 para receber mensagens e
SMTPS na porta 465 para envio de mensagens:

# iptables -A FORWARD -i enp0s6 -p tcp --dport 465 -j ACCEPT


# iptables -A FORWARD -i enp0s6 -p tcp --dport 993 -j ACCEPT

Qualquer outro pacote que não se enquadre nestas regras será descartado (Política DROP).

As regras aplicadas podem ser vistas com a opção "-S":

-P INPUT DROP
-P FORWARD DROP
-P OUTPUT DROP
-A INPUT -p udp -m udp --sport 5353 -j ACCEPT
-A INPUT -p udp -m udp --sport 53 -j ACCEPT
-A INPUT -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -s 192.168.15.0/24 -d 192.168.15.67/32 -i enp0s6 -p tcp
-m tcp --dport 22 -j ACCEPT
-A FORWARD -p udp -m udp --dport 53 -j ACCEPT
-A FORWARD -p icmp -j ACCEPT
-A FORWARD -i enp0s6 -p tcp -m tcp --dport 465 -j ACCEPT
-A FORWARD -i enp0s6 -p tcp -m tcp --dport 993 -j ACCEPT
-A FORWARD -i enp0s6 -p tcp -m tcp --dport 80 -j ACCEPT
-A FORWARD -i enp0s6 -p tcp -m tcp --dport 443 -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 22 -j ACCEPT
474 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

-A OUTPUT -p udp -m udp --dport 53 -j ACCEPT


-A OUTPUT -p udp -m udp --sport 53 -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT

A opção "-L" também mostra as regras aplicadas, e se usada em conjunto com a opção "-v",
mostra um contador de pacotes. A opção "-n" diz para não resolver nomes, o que torna o
comando mais rápido. O destaque indica o contador de pacotes:

# iptables -L -v -n
Chain INPUT (policy DROP 18 packets, 736 bytes)
pkts bytes target prot opt in out source
destination
105 17909 ACCEPT udp -- * * 0.0.0.0/0
0.0.0.0/0 udp spt:5353
0 0 ACCEPT udp -- * * 0.0.0.0/0
0.0.0.0/0 udp spt:53
0 0 ACCEPT udp -- * * 0.0.0.0/0
0.0.0.0/0 udp dpt:53
0 0 ACCEPT icmp -- * * 0.0.0.0/0
0.0.0.0/0
0 0 ACCEPT tcp -- enp0s6 * 192.168.15.0/24
192.168.15.67 tcp dpt:22
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source
destination
0 0 ACCEPT udp -- * * 0.0.0.0/0
0.0.0.0/0 udp dpt:53
0 0 ACCEPT icmp -- * * 0.0.0.0/0
0.0.0.0/0
0 0 ACCEPT tcp -- enp0s6 * 0.0.0.0/0
0.0.0.0/0 tcp dpt:465
0 0 ACCEPT tcp -- enp0s6 * 0.0.0.0/0
0.0.0.0/0 tcp dpt:993
0 0 ACCEPT tcp -- enp0s6 * 0.0.0.0/0
0.0.0.0/0 tcp dpt:80
6 360 ACCEPT tcp -- enp0s6 * 0.0.0.0/0
0.0.0.0/0 tcp dpt:443
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source
destination
0 0 ACCEPT tcp -- * * 0.0.0.0/0
0.0.0.0/0 tcp spt:22
3 294 ACCEPT udp -- * * 0.0.0.0/0
0.0.0.0/0 udp dpt:53

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 475


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

0 0 ACCEPT udp -- * * 0.0.0.0/0


0.0.0.0/0 udp spt:53
0 0 ACCEPT icmp -- * * 0.0.0.0/0
0.0.0.0/0

Você pode usar esse comando em conjunto com o comando watch para assistir o contador
ser incrementado a cada segundo com os pacote que casarem com alguma regra:

# watch -n 1 iptables -L -v -n

Se você errar alguma regra, poderá apagar com a opção "-D", ou mesmo começar
novamente com a opção "-F" para limpar tudo.

As regras do Netfilter serão perdidas após o reinício da máquina se não forem devidamente
salvas.

O comando iptables-save imprime as regras na saída padrão, que pode ser direcionada
para um arquivo:

# iptables-save > firewall

Para restaurar as regras salvas com o iptables-save, pode-se usar comandos iptables-
restore:

# iptables-restore < firewall

Para que as regras de Firewall sejam carregadas no momento do boot, é preciso coloca-las
em arquivos apropriados.

Em distribuições baseadas em RedHat, CentOS e Fedora, basta colocar as regras no arquivo


/etc/sysconfig/iptables:

# iptables-save > /etc/sysconfig/iptables

Já no Debian e Ubuntu, é necessário instalar o pacote iptables-persistent:

# apt install iptables-persistent

Depois de instalado o pacote, o arquivo das regras no Debian/Ubuntu fica em o


/etc/iptables/rules.v4:

476 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

# iptables-save > /etc/iptables/rules.v4

É preciso de prática para lidar com o iptables. Por isso o Linux possui outra ferramenta mais
fácil para trabalhar com o Netfilter: firewalld.

Firewalld

O Firewalld oferece uma interface gráfica e também de linha de comando para gerenciar os
serviços de filtros de pacotes do Netfilter.

O Firewalld vem com um servidor Daemon chamado firewalld para controlar as regras do
Netfilter, diretamente via interface do D-BUS, sem a necessidade de reiniciar o serviço.

Para simplificar, o firewalld trabalha agrupando o tráfego em zonas. Uma zona pode ser um
conjunto de endereços de origem, ou uma interface de rede.

Cada zona possui o seu arquivo de configuração. Os arquivos das zonas padrão do firewalld
ficam no diretório /usr/lib/firewalld/zones:

$ ls -1 /usr/lib/firewalld/zones
block.xml
dmz.xml
drop.xml
external.xml
home.xml
internal.xml
public.xml
trusted.xml
work.xml

A tabela a seguir descreve a função de cada zona, ordenada da mais restritiva até a zona de
confiança total:

Zona Descrição

drop Quaisquer pacotes de rede recebidos são descartados, não haverá resposta. Somente conexões de
rede de saída são possíveis.

block Quaisquer conexões de rede de entrada são rejeitadas com uma mensagem icmp. Somente
conexões de rede iniciadas neste sistema são possíveis.

public Para uso em áreas públicas. Você não confia nos outros computadores em redes para não danificar
seu computador. Somente conexões de entrada selecionadas são aceitas.

external Para uso em redes externas com mascaramento habilitado especialmente para roteadores. Você
não confia nos outros computadores em redes para não danificar seu computador. Somente
conexões de entrada selecionadas são aceitas.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 477


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Zona Descrição

dmz Para computadores em sua zona desmilitarizada que são acessíveis ao público com acesso limitado
à sua rede interna. Somente conexões de entrada selecionadas são aceitas.

work Para uso em áreas de trabalho. Você confia na maioria dos outros computadores na rede. Somente
conexões de entrada selecionadas são aceitas.

home Para uso em áreas domésticas. Você confia na maioria dos outros computadores na rede. Somente
conexões de entrada selecionadas são aceitas.

internal Para uso em redes internas. Você confia na maioria dos outros computadores na rede Somente
conexões de entrada selecionadas são aceitas.

trusted Todas as conexões de rede são aceitas.

Os arquivos de configuração das zonas são escritos em Extensible Markup Language (XML).

O principal comando para trabalhar com o firewalld é o firewall-cmd. A opção "--get-zones"


lista as zonas predefinidas disponíveis:

$ firewall-cmd --get-zones
block dmz drop external home internal public trusted work

Para ver a zona padrão aplicada, pode-se usar a opção "--get-default-zone":

$ firewall-cmd --get-default-zone
public

Para altera a zona padrão, usa-se a opção "--set-default-zone=nomedazona":

# firewall-cmd --set-default-zone=dmz
success

Para ver a zona ativa em cada interface, usa-se a opção "--get-active-zone":

$ firewall-cmd --get-active-zone
public
interfaces: enp0s5 enp0s6

Além das zonas, o firewalld emprega o conceito de serviços, que são configurações de
firewall que podem ser aplicadas quando a máquina oferece algum serviço de rede.

A opção "--get-services" mostra as configurações de serviços disponíveis:

478 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

$ firewall-cmd --get-services
RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd
audit bacula bacula-client bb bgp bitcoin bitcoin-rpc bitcoin-
testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-mon cfengine
cockpit condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc
dns dns-over-tls docker-registry docker-swarm dropbox-lansync
elasticsearch etcd-client etcd-server finger freeipa-4 freeipa-
ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-
client ganglia-master git grafana gre high-availability http
https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns
jenkins kadmin kdeconnect kerberos kibana klogin kpasswd kprop
kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr
managesieve matrix mdns memcache minidlna mongodb mosh mountd
mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe
ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-
vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s
postgresql privoxy prometheus proxy-dhcp ptp pulseaudio
puppetmaster quassel radius rdp redis redis-sentinel rpc-bind rsh
rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips
slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync
spotify-sync squid ssdp ssh steam-streaming svdrp svn syncthing
syncthing-gui synergy syslog syslog-tls telnet tentacle tftp
tftp-client tile38 tinc tor-socks transmission-client upnp-client
vdsm vnc-server wbem-http wbem-https wsman wsmans xdmcp xmpp-bosh
xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server

Para ver os serviços aplicados em uma determinada zona, pode-se usar a opção "--zone" em
conjunto com a opção "--get-services":

$ firewall-cmd --list-services --zone=public


dhcpv6-client ssh

Neste exemplo a zona public está com os serviços dhcpv6-client e ssh habilitados.

Para habilitar um serviço em uma zona, pode-se usar a opção "--add-service=servico" em


conjunto com a opção "--zone":

# firewall-cmd --add-service=dns --zone=public


success

O firewalld também tem um botão de pânico para desabilitar todo o tráfego de rede:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 479


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

# firewall-cmd --panic-on

Para retornar as operações em modo normal:

# firewall-cmd --panic-off

Todas as configurações realizadas no firewalld não são permanentes, até que a opçãp "--
runtime-to-permanent" seja executadas:

# firewalld-cmd --runtime-to-permanent

Em qualquer momento é possível ver as regras aplicadas com o firewalld usando o comando
iptables com a opção "-L" ou "-S".

A Interface Gráfica do Firewalld pode ser instalada no Debian/Ubuntu com o comando:

# apt install firewall-applet

E no Redhat/CentOS com o comando:

# yum install firewall-applet

E para ser executada, basta executar o comando "firewall-config".

Figura 46 - firewall-config
480 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

Sem dúvida a administração de um firewall pessoal com a interface gráfica do Firewalld é


muito mais fácil do que utilizar o iptables.

UFW

O Ubuntu tem o seu próprio firewall pessoal, chamado Uncomplicated Firewall (UFW).

Ele pode ser configurado pela linha de comandos, com o comando ufw, ou através do
utilitário gráfico Gufw.

Como padrão, o UFW vem desabilitado no Ubuntu. Para habilitá-lo, utiliza-se o comando:

# ufw enable
Firewall is active and enabled on system startup

Para desabiltiar o UFW, utiliza-se o comando:

# ufw disable

Para voltar as configurações de fábrica:

# ufw reset

Para liberar uma determinada porta, utiliza-se a opção "allow" seguido do número da porta
/ protocolo:

# ufw allow 22/tcp


Rule added
Rule added (v6)

Ou pelo nome do serviço:

# ufw allow http


Rule added
Rule added (v6)

Também é possível bloquear o tráfego de uma determinada fonte:

# ufw deny from 192.168.0.0/24 port 80

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 481


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Rule added

Para ver as regras, e o status do ufw:

# ufw status
Status: active
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
80/tcp ALLOW Anywhere
Anywhere DENY 192.168.0.0/24 80
22/tcp (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)

Para apagar uma regra, é interessante numerá-las com o comando:

# ufw status numbered


Status: active
To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere

[ 2] 80/tcp ALLOW IN Anywhere

[ 3] Anywhere DENY IN 192.168.0.0/24 80

[ 4] 22/tcp (v6) ALLOW IN Anywhere (v6)

[ 5] 80/tcp (v6) ALLOW IN Anywhere (v6)

E depois utilizar a opção delete para apagar:

# ufw delete 5
Deleting:
allow 80/tcp

As regras do UFW ficam no diretório /etc/ufw. As regras do usuário são gravadas no arquivo
/etc/ufw/user.rules:

# ls -1 /etc/ufw/
after6.rules
after.init
482 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

after.rules
applications.d
before6.rules
before.init
before.rules
sysctl.conf
ufw.conf
user6.rules
user.rules

O UFW também permite instalar regras por aplicação. O comando "app list" mostra as
aplicações instaladas como padrão:

# ufw app list


Available applications:
CUPS
OpenSSH

A interface gráfica do UFW precisa ser instalada a parte usando a Loja de Aplicativos do
Ubuntu. Seu uso é tão intuitivo quando o Firewalld.

Figura 47 - gufw

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 483


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

IPSet

O IPset é uma ferramenta do Netfilter que pode ser utilizada no Firewalld e no Iptables para
facilitar o trabalho de administração de regras.

Seu objetivo é criar listas com conjuntos de IPS, portas, etc. Estas listas podem ser usadas
para criar regras de forma facilitada.

O ipset pode ser instalado usando o gerenciador de pacotes no Debian/Ubuntu:

# apt install ipset

E no Redhat/CentOS/Fedora:

# yum install ipset

Uma vez instalado, pode-se criar uma lista que agrupe um conjunto de endereços, portas,
etc.

O comando "create" cria uma lista:

# ipset create banidos hash:net

É preciso especificar o nome da lista, e o seu tipo. O tipo "hash" permite uma lista de
tamanho variável, e o subtipo "net" especifica endereços de rede com máscara.

Para adicionar uma rede à lista:

# ipset add banidos 200.251.155.30/24


# ipset add banidos 108.223.43.30/24

Para ver a lista recém criada:

# ipset list banidos


Name: banidos
Type: hash:net
Revision: 6
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 472
References: 0

484 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Number of entries: 2
Members:
108.223.43.0/24
200.251.155.0/24

Para excluir um item da lista:

# ipset del banidos 200.251.155.0/24

Usando as listas do IPSet fica mais fácil criar regras:

# iptables -I INPUT -m set --match-set banidos src -j DROP

Desta forma, fica fácil incluir ou retirar IPs das regras do Netfilter, adicionar ou remover
portas, sem a necessidade de criar ou apagar regras, bastando operar as listas do IPSet.

Para que listas criadas com o IPSet sejam permanentes e sobrevivam ao reboot da máquina,
é preciso salvá-las no arquivo /etc/ipset.conf:

# ipset save > /etc/ipset.conf

O conteúdo do arquivo pode ser consultado com o comando:

# cat /etc/ipset.conf
create banidos hash:net family inet hashsize 1024 maxelem 65536
add banidos 108.223.43.0/24

Regras Dinâmicas

O Linux também oferece pacotes para gerenciamento de regras de Firewall no Netfilter de


modo dinâmico. Esses pacotes inspecionam atividades maliciosas, e quando encontram algo,
acionam um filtro automaticamente para bloquear aquele tipo de atividade.

Essas aplicações são chamadas de Intrusion Detection Systems - IDS.

Fail2ban

O pacote fail2ban é um serviço que monitora os LOGs do sistema em busca de falhas e


comportamentos maliciosos. Se ele detecta um problema, o fail2ban é capaz de aplicar uma
regra no Netfilter para banir o IP da fonte que está causando o problema.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 485


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Por exemplo, se determinado IP está tentando fazer uma conexão SSH através de força
bruta, testando diversas combinações de login/senha, o fail2ban pode blockear esse
endereço IP no Netfilter de forma que ele não vai mais conseguir uma conexão ssh.

O fail2ban pode varrer os Logs de autenticação, como o /var/log/auth.log, bem como o Log de
diversas aplicações, e trabalha com TCP Wrappers, Firewalld e também o Iptables.

Sua instalação pode ser feita através de um gerenciador de pacotes:

# apt install fail2ban

Ou

# yum install fail2ban

Seu principal arquivo de configuração é o /etc/fail2ban/jail.conf. Este arquivo contém os


arquivos de LOG que serão monitorados pelo Fail2ban.

Para habilitar o Fail2ban, usa-se o systemctl:

# systemctl enable fail2ban

Para iniciar o fail2ban:

# systemctl start fail2ban

DenyHosts

O DenyHosts é mais simples que o Fail2ban.

Ele basicamente é um script em Python que monitora as conexões do OpenSSH, olhando os


Logs e adiciona os endereços no /etc/hosts.deny.

O DenyHosts pode ser instalado com qualquer gerenciador de pacotes, com o nome
"denyhosts".

Ele pode ser executado como um serviço ou através de um Job no Cron. O instalador de
pacotes já configura o DenyHosts para funcionar como um serviço do Systemd.

Como serviço, ele pode ser habilitado e iniciado com os comandos do systemctl:

# systemctl enable denyhosts

486 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

# systemctl start denyhosts

Ele monitora os arquivos de Log /var/log/secure e /var/log/auth.log em busca de


tentativas de conexão de SSH que se pareçam com um ataque de força bruta.

Os endereços IP de origem que pareçam maliciosos para o DenyHosts são colocados no


arquivo /etc/hosts.deny. O OpenSSH precisa estar utilizando o TCPWrapper para que o
DenyHosts funcione.

O arquivo de configuração principal do DenyHosts é o /etc/denyhosts.conf.

Por ser bem simples, o DenyHosts não atua no Netfilter, e também só restringe o tráfeco TCP
para a porta 22 com o IPv4.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 487


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Simulado
3.6 Backup, Restauração e Compressão
de Arquivos

Implementar uma estratégia para salvar os dados importantes com certa periodicidade, e a
efetiva recuperação dos dados de forma rápida e eficiente em caso de um sinistro, são
tarefas importantes para todo administrador.

Para desenvolvermos uma estratégia de backup, precisamos ter em mente as seguintes


questões:

Quais arquivos precisam ser salvos?


Onde estão esses arquivos?
Qual o volume dos dados a serem salvos?
Quando e aonde serão efetuadas as cópias de segurança?
Com qual frequência estes arquivos mudam?
Em quanto tempo estes arquivos precisam ser recuperados em caso sinistro?
Onde serão restaurados os dados?
Que tipo de backup será efetuado?

A resposta para cada uma destas perguntas vai variar muito de acordo com a aplicação e
cenário.

Mas importantes orientações podem ser feitas, de acordo com as características de cada
ferramenta, para dar ao administrador o conhecimento necessário para responder estas
questões dentro do seu contexto.

Os arquivos que necessitam serem salvos em um backup são específicos de cada sistema e
de cada aplicação. Em linhas gerais é importante que os arquivos dos seguintes diretórios
tenham um backup regular:

Todo o conteúdo de /home


Todo o conteúdo de /etc
Todo o conteúdo de /boot

E quaisquer outros arquivos que sejam importantes, como banco de dados, configurações de
aplicativos, arquivos de usuários, etc. Isso vai depender da aplicação que o Linux está
servindo.

Para a escolha de um destino para os dados copiados deve-se considerar uma série de
fatores.

A mídia escolhida precisa ter a capacidade de armazenamento suficiente para toda a


informação.
488 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

Outra questão é se a velocidade de backup e restauração é satisfatória.

E um fator muito importante é o tempo de retenção dos dados. Seu backup deve durar em
boas condições quantos anos?

O número de operações com a mídia deve ser eficiente em relação ao seu custo. Um DVD-R
por exemplo tem o custo baixo, e permite apenas uma gravação.

O Linux suporta dezenas de dispositivos apropriados para cópias de segurança, tais como:

Fitas DDS, como SCSI DAT;


CD-Regravável;
DVD-Regravável
Fitas de alta performance DLT;
Dispositivos Óticos-Magnéticos;
Fitas QiC / Travan;
Discos remotos;
Armazenamento removível USB;
RAID;
Cloud;

Em linhas gerais também são boas práticas de backup as seguintes recomendações:

Guarde os backups antigos;


Nunca tenha um só backup.
Verifique os sistemas de arquivos antes de efetuar o backup;
Faça os backups em horários de pouca ou nenhuma atividade no sistema;
Sempre faça backups do sistema antes de efetuar alterações substanciais, como
mudança de versão;
Sempre procure fazer mais de uma cópia de segurança, pois as mídias também estão
sujeitas às falhas e sinistros.
Utilize um número adequado de mídias para que exista a garantia que os dados estão
realmente salvos.
O fator tempo de retenção dos dados e rodízio das mídias também devem ser
considerados.
Outro ponto de suma importância é executar testes de verificação das cópias de
seguranças recém-gravadas.

Tenha em mente que a eficiência de um backup não está na cópia dos arquivos, mas sim na
restauração.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 489


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Tipos de Backup
Os fatores como o volume dos dados e a frequência com que eles são alterados influem na
escolha correta do tipo de backup.

Vejamos quais são eles:

Backup Completo

Um backup completo pode significar a cópia todos os discos, de todas as partições e de todos
os dados de um sistema.

Este tipo de estratégia não é muito eficiente pelo volume de dados que pode gerar.

Desta forma, a sua periodicidade tende a ser com um intervalo de tempo maior, pois leva
mais tempo para ser feito. Este tipo de backup deve pode ser feito em conjunto com outros
tipos de backup para diminuir o volume de dados a ser copiado.

Backup Diferencial

Um backup diferencial somente salva os arquivos que foram modificados ou criados depois
de um backup completo.

Eles são relativamente rápidos porque o volume dos dados tende a ser menor do que um
backup completo.

Esta estratégia ignora os backups feitos entre a última cópia diferencial e o backup completo.

Desta maneira, para restaurar os arquivos, é necessário o backup completo mais a última
cópia diferencial.

Este tipo de backup gasta menos mídias que o backup incremental, mas se o volume dos
dados alterados desde a última cópia completa for muito grande, ele exigirá mais do sistema.

Backup Incremental

Um backup incremental somente salva os arquivos que foram modificados depois o backup
completo ou depois da última cópia incremental.

Desta forma eles devem ser salvos com maior periodicidade.

Para recuperar todo o sistema é preciso voltar o backup completo e toda a sequência de
backup incremental.

Este estratégia é ideal quando grandes volumes de dados são alterados diariamente.

Uma estratégia de backup sábia combina estes tipos para uma maior eficiência e menor
necessidade de mídias e recursos computacionais.

Como exemplo, o administrador poderá implementar um backup completo do sistema a cada


semana e executar cópias incrementais e/ou diferenciais todos os dias.

490 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Snapshots

Outro tipo de backup comum nos sistemas de arquivos modernos, como o Btrfs e o uso do
LVM, é a possibilidade de se criar imagens de cópias de volumes, chamados de snapshots.

Essas cópias de volumes salvam todo o conteúdo de uma partição ou volume em um arquivo
de imagem. Este arquivo pode ser salvo em alguma mídia, e caso necessite ser restaurado
com facilidade

Imagens

O Linux ainda permite através do utilitário dd, criar imagens de discos ou partições inteiros,
independente do sistema de arquivos. Este utilitário é capaz de gerar um arquivo, ou fazer
cópias diretas para outros discos.

A seguir serão apresentadas ferramentas nativas do Linux para Backup.

tar
$ tar [opções] origem destino

O tar é uma excelente ferramenta nativa para fazer backup dos dados no Linux.

Ele provê a compactação dos dados com diversos algoritmos, e permite fazer backups
completos e incrementais.

Para criar um backup completo, pode-se usar a opção "cvf" e escolher um compactador:

Extensão Compactador Utilizado Opção do Tar

.tar.gz Gzip $ tar cvzf backup.tar.gz /dados

.tar.bz2 Bzip2 $ tar cvjf backup.tar.bz2 /dados

.tar.xz Xz $ tar cvJf backup.tar.xz /dados

A razão de escolha do compactador, vai depender de quanto se quer despender tempo de


CPU em relação ao nível de compactação. O XV é o algoritmos que irá gastar mais tempo de
CPU, porém, pode ter taxas de compressão de dados maiores.

$ tar cvJf backup.tar.xz /dados

O arquivo recém gerado backup.tar.xz contém o backup completo da pasta /dados.

Para fazer um backup incremental, deve-se usar a opção "-g" do tar para fazer o backup
completo, criando um arquivo de controle.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 491


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

$ tar cvJf backup.tar.xz -g controle /dados

O arquivo backup.tar.xz é um backup completo.

Para fazer o backup incremental, o comando é o mesmo. Só se deve alterar o nome do


arquivo de backup:

$ tar cvJf backup_incremental.tar.xz -g controle /dados

Pode-se ver os dois backups completo e incremental:

$ ls -lh backup*
-rw-r--r-- 1 root root 75K Dec 31 17:58
backup_incremental.tar.xz
-rw-r--r-- 1 root root 2.5M Dec 31 17:56 backup.tar.xz

Para testar um backup, utiliza-se a opção "d" no lugar do "c" do tar:

$ tar dvJf backup.tar.xz

cpio
$ cpio -o [parâmetros] < arquivo > saída

O comando cpio é o programa original do UNIX para a troca de arquivos entre máquinas por
meio de mídias magnéticas. Ele permite gravar sistemas de arquivos de diferentes formatos
e o redirecionamento dos dados para outros programas.

No modo cópia de entrada, o cpio lê uma lista de nome de arquivos, um em cada linha, na
entrada padrão ou de um arquivo texto, e copia cada um deles em um arquivo maior na
saída padrão.

Sintaxe do modo de cópia de entrada:

$ cpio -o [parâmetros] < arquivo > saída

Sintaxe do modo de cópia de saída:

$ cpio -i [parâmetros] < arquivo

492 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

As opções abaixo podem ser usadas em qualquer um dos modos:

-c: Grava o cabeçalho do arquivo em ASCII para portabilidade;


-d: Cria quantos diretórios forem precisos;
-v: Lista os arquivos processados;
-V: Gera uma barra de progresso com o símbolo ponto “.” para cada arquivo
processado;
-u: Faz uma cópia incondicional dos arquivos.

No exemplo abaixo o comando copia todos os arquivos de um diretório para uma fita em
/dev/st0:

$ ls -R | cpio -oVc > /dev/st0

Para listar os arquivos de um arquivo cpio:

$ cpio -itvf < nome_do_arquivo

Para voltar um backup em fita utilizando o cpio:

$ cpio -icvd < /dev/st0

dd
$ dd if=entradadedados of=saidadedados

O comando dd converte e copia arquivos, discos e partições para um arquivo, para um disco
e dispositivos de bloco. Ele é muito útil para produzir cópias de partições e discos inteiros em
imagens, bem como o inverso: gravar imagens em discos.

Seus parâmetros mais comuns são:

bs=BYTES Lê e converte até uma quantidade de BYTES por vez


count=N Copia somente N quantidade de blocos
if=ARQUIVO Lê os dados de um arquivo ou dispositivo ao invés da entrada padrão
of=ARQUIVO Grava os dados em um arquivo ou dispositivo ao invés da saída
padrão

Para copiar um DVD para uma imagem em arquivo:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 493


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

$ dd if=/dev/sr0 of=/tmp/disco1.img

Para gravar uma imagem em um disquete:

$ dd if=/root/disco1.bin of=/dev/fd0

Este comando também pode ser usado para fazer um clone de um disco para outro.

Suponhamos dois discos, um instalado como primary master (/dev/sda) e o outro como
primary slave (/dev/sdb):

$ dd if=/dev/sda of=/dev/sdb

Como a cópia é feita bit a bit, não importa qual é sistema operacional, nem o sistema de
arquivos usado no disco de origem. A cópia é completa, incluindo a tabela de partição do
disco e o setor de boot.

Fazendo Backup do Master Boot Record


O MBR é o primeiro setor do disco, na trilha 0. Ocupa um setor no cilindro 0, lado 0 e setor 1.
Seu tamanho é sempre de 512 bytes. Nos últimos 64 bytes do MBR, é onde está armazenada
a Tabela de Partições onde estão armazenadas as informações sobre as partições do disco,
informando se é inicializável, se são primárias ou estendidas e qual sistema de arquivos elas
utilizam (EXT2, EXT3, EXT4, FAT, NTFS, etc).

Além da tabela de partições, o MBR inicia o setor de boot da primeira partição primária ativa
do disco. No setor de boot dessa partição são armazenadas as informações necessárias para
ler os arquivos de inicialização do sistema operacional.

Desta maneira, a MBR contém informações muito importantes para o funcionamento do


sistema. Ter uma cópia desta informação é muito importante, mas quase ninguém se lembra
disto.

O backup do MBR pode ser feito usando o dd, com a opção bs=512 (tamanho do MBR) e com
count=1 para copiar somente os primeiros 512 bytes do disco:

$ dd if=/dev/sda of=/tmp/mbr.backup bs=512 count=1

Para restaurar:

$ dd if=/tmp/mbr.backup of=/dev/sda bs=512 count=1

494 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

rsync
$ rsync [opções] origem destino

O comando rsync pode ser utilizado para fazer backup remoto dos arquivos.

Com a opção "-a" o rsync faz cópia de backup de todos os arquivos e subdiretórios,
recursivamente, preservando vários atributos dos arquivos, tais como dono do arquivo,
grupo, hora de modificação, permissões e links simbólicos.

Fazer cópias locais para discos locais com o rsync é muito simples:

$ rsync -avh * /backup

O rsync também permite cópias de arquivos remotamente com muita facilidade. É preciso
que ele esteja instalado na máquina local e na máquina remota, que precisa estar
executando o OpenSSH.

$ rsync -avP -e ssh -z * uiraribeiro@servidorbackup:~/backup

A opção "-P" faz com que o rsync possa controlar transferências parciais, caso a conexão
caia.

A opção "-e ssh" faz com que o rsync utilize o ssh como protocolo de transferência, criando
um túnel criptografado.

A opção "-z" emprega o uso da biblioteca zlib para comprimir os dados antes de enviar. Isso
pode ser útil em conexões lentas.

O endereço remoto deverá conter o login do usuário (uiraribeiro), o endereço ou IP do


servidor, seguido de dois-pontos ":" e o diretório no servidor remoto para onde vão os
arquivos. O usuário no servidor remoto precisa ter permissões para gravar no servidor.

scp
$ scp [opções] origem destino

O scp é um utilitário do pacote OpenSSH que serve para fazer cópias de arquivos utilizando
um túnel criptografado pelo SSH.

Ele é últil para transferências de pequenos arquivos, uma vez se a conexão for interrompida,
ele não retoma de onde parou.

Exemplo:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 495


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

$ scp arquivo uiraribeiro@servidor.com:~/backup

O scp pode ser usado com as seguintes opções:

-C Comprime os arquivos durante a transferência;


-p Preserva as permissões dos arquivos e datas de acesso e modificação;
-r Copia recursivamente subdiretórios e arquivos;

O scp pode ser usado para fazer cópias entre duas máquinas remotas:

$ scp -rcv usuario1@maquina1:/arquivos usuario2@maquina2:/backup

sftp
sftp [opções] origem destino

O sftp é outra ferramenta do pacote OpenSSH para cópias de arquivos.

Ele faz cópias através de um túnel seguro ssh, e permite um shell interativo, assim como o
antigo ftp.

Para utilizar o sftp deve-se informar o login do usuário, seguido do host:

$ sftp uiraribeiro@servidor
Connected to servidor
sftp>

O sftp permite uma série de comandos:

get Utilizado para baixar arquivos do servidor remoto para a máquina local;
reget Recomeça uma transmissão de download interrompida;
put Utilizado para enviar arquivos locais para o servidor remoto;
reput Recomeça uma transmissão de upload interrompida;
ls Lista o conteúdo do diretório remoto;
lls Lista o conteúdo do diretório local;
cd Troca de diretório remoto;
lcd Troca de diretório local.
pwd Mostra o diretório remoto corrente;
bye Desconecta;

Pode-se operar as transferências com sftp como se estivesse no shell remoto, com os
496 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

comandos cd, ls, pwd.

Verificando a Integridade

Verificar a integridade dos arquivos é importante em um processo de Backup / Restore.

O Linux possui utilitários que geram um hash de arquivos, de forma que a sua integridade
pode ser comparada com o hash dos arquivos originais.

sha256sum
$ sha256sum [opções] arquivo

O programa sha256sum foi projetado para verificar a integridade dos dados usando o
algoritmo SHA-256 (família SHA-2 com um tamanho de resumo de 256 bits). Os hashes
SHA-256 gerados pelo programa sha256sum podem confirmar a integridade e a
autenticidade do arquivo, comparando-se a chave SHA-256 que o autor do arquivo
geralmente disponibiliza.

O teste é feito pela comparação de hashes, que torna possível detectar alterações nos
arquivos. A possibilidade de alterações é proporcional ao tamanho do arquivo; a possibilidade
de erros aumenta à medida que o arquivo aumenta.

Neste exemplo vamos verificar o SHA-256 do Ubuntu 19.04 Desktop.

O Ubuntu distribui os hashes de soma de verificação SHA-256 em um arquivo chamado


SHA256SUMS na mesma listagem de diretório da página de download da versão
http://releases.ubuntu.com. Após baixar o arquivo, você pode usar o sha256sum para
imprimir uma única linha depois de calcular o hash:

$ sha256sum ubuntu-19.04-desktop-amd64.iso
2da6f8b5c65b71b040c5c510311eae1798545b8ba801c9b63e9e3fd3c0457cbe
*ubuntu-19.04-desktop-amd64.iso

Este número deve ser comparado com o hash SHA-256 disponibilizado no site da distribuição.

sha512sum
$ sha512sum [opções] arquivo

O programa sha512sum faz a mesma coisa que o sha256sum, mas com hashes de 512 bits.
Ele aumenta a confiabilidade do hash, especialmente em arquivos grandes.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 497


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Seu funcionamento é o mesmo do sha256sum, mas com hash maior:

$ sha512sum ubuntu-19.04-desktop-amd64.iso
6a2c8acc42b2e2f5ae9f9382656a311f46b93983c9b5063b465c33c3da3fcd577
00d73f525d14ba420f598349787b1ab26b58b343c427975b77f53cd63cea316
ubuntu-19.04-desktop-amd64.iso

Este número deve ser comparado com o hash SHA-512 disponibilizado no site da distribuição.

md5sum
$ md5sum [opções] arquivo

O programa md5sum serve para fazer a mesma coisa que o sha256sum, mas com a soma de
verificação usando o algorítimo MD5. Apesar de ser menos confiável que o SHA-256 e
SHA-512, o md5sum está disponível em versões para Windows e Mac OS.

Seu funcionamento é o mesmo do sha256sum:

$ md5sum ubuntu-19.04-desktop-amd64.iso
6fa9686bc299c19c97d280f79a723868 ubuntu-19.04-desktop-amd64.iso

Este número deve ser comparado com o hash MD5 disponibilizado no site da distribuição.

As coisas que nos pertencem acabam voltando para nós.


Bem, nem sempre da forma que esperamos,
Luna Lovegood em Harry Potter e a Ordem da Fênix.

498 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Diagnóstico e Resolução de
Problemas do Linux

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 499


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

500 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Comece fazendo o necessário;


então faça o que é possível;
e de repente você está fazendo o impossível.
-- Francisco de Assis

Simulado
4.1 Analise as Propriedades do
Sistema e Corrija como corresponder

Para diagnosticar os problemas de rede, é necessário ter um conhecimento básico do


funcionamento dos procolos da Internet e implementação deles no Linux.

O TCP/IP Transmission Control Protocol / Internet Protocol se tornou o protocolo de


comunicações padrão entre computadores a partir do crescimento exponencial da Internet. O
UNIX sempre utilizou o TCP/IP como padrão e o Linux herdou este protocolo, bem como a
Internet.

O endereço IP na versão 4 é escrito na notação decimal com quatro posições de 8 bits cada,
totalizando 32 bits. Cada parte do endereço pode ir de 0 a 255 na notação decimal.

x.y.z.w
192.168.1.1

O protocolo permite que uma rede seja dividida em classes e subclasses de endereçamento.
As classes indicam onde começa e termina uma rede e precisam de dois IPs para marcar o
seu início e final.

A divisão de redes por classes é útil para dividir as redes de alguma forma lógica que
enquadre as necessidades das empresas e pessoas. Por exemplo, você pode dividir as redes
por departamento, por prédios físicos de uma escola, em rede administrativa e rede de
convidado, enfim, qualquer divisão que ajude a administrar melhor a rede.

Esta divisão é feita utilizando um recurso chamado máscara de rede (subnet mask):

Número IP: 192.168.1.1 / Sub-rede: 255.255.255.0

A subnet mask funciona exatamente como uma máscara, indicando quais bits serão
utilizados para definir a parte de endereçamento de rede e quais bits são usados para definir
a parte de endereços de máquinas.

O modelo TCP/IP tem cinco classes de endereços definidas identificadas pelas letras: A, B, C,
D e E. Para cada classe existe um determinado número de redes possíveis e, em cada rede,

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 501


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

um número máximo de máquinas.

Classe A

Esta classe foi definida com o primeiro bit do número IP igual a zero. Desta forma o primeiro
número IP somente poderá variar de 1 até 126.

A máscara de rede para a classe A é:

255.0.0.0 (11111111.00000000.00000000.00000000), 8-bits para rede


e 24-bits para máquinas.

O número de redes de tamanho de uma Classe A possíveis é calculado: 2 elevado ao número


de bits de rede - 2:

(2^n)-2

Como o primeiro bit sempre é zero, o número de bits para a rede é 7;

(2^7)-2 = 128-2 -> 126 redes Classe A.

O número de máquinas em uma rede Classe A também é calculado da mesma forma. Uma
classe A tem 24 bits para máquinas;

(2^24)-2 = 16.777.216-2 -> 16.777.214 máquinas em cada rede


classe A.

Classe B

Esta classe foi definida como dois primeiros bits do número IP iguais a 1 e 0. Desta forma o
primeiro número do endereço IP somente poderá variar de 128 até 191.

Para a Classe B, foi definida a seguinte máscara de sub-rede:

255.255.0.0 (11111111.11111111.00000000.00000000), 16-bits


para rede e 16-bits para máquinas.

O número de redes Classe B possíveis é de 16.382, e o número de máquinas em uma rede


classe B é de 65.534.

Classe C

Esta classe foi definida como três primeiros bits do número IP iguais a 1, 1 e 0. Assim, o
primeiro número do endereço IP somente poderá variar de 192 até 223.

502 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Para a Classe C foi definida a seguinte máscara de sub-rede:

255.255.255.0 (11111111.11111111.11111111.00000000), 24-bits


para rede e 8-bits para máquinas.

O número de redes Classe C é de 2.097.150, e o número de máquinas em uma rede classe


C é de 254.

Classe D

Esta classe foi definida como quatro primeiros bits do número IP iguais a 1, 1, 1 e 0. A classe
D é uma classe especial, reservada para os chamados endereços de Multicast.

Classe E

Esta classe foi definida como quatro primeiros bits do número IP iguais a 1, 1, 1 e 1. A classe
E é uma classe especial e está reservada para uso futuro.

Classe Primeiros bits Núm. Redes Máquinas por Máscara


rede

A 0 126 16.777.214 255.0.0.0

B 10 16.382 65.534 255.255.0.0

C 110 2.097.150 254 255.255.255.0

D 1110 Multicast - -

E 1111 Reservado - -

Outra forma de calcular o tamanho de uma rede é você subtrair de 256 (8 bits) o octeto da
máscara que é diferente de 255.

Exemplo:

192.168.1.0 com a máscara 255.255.255.0. Logo, o último octeto da máscara é zero.

Então 256 – 0 = 256. Para saber o número de IPs disponíveis, você subtrai do resultado -2.

Esta rede tem então 256 - 2 = 254 Ips válidos. Isso acontece porque uma rede sempre utiliza
o primeiro IP para delimitar seu início e o último IP para delimitar o seu fim. A rede terá Ips
válidos de 192.168.1.1 até 192.168.1.254.

Vejamos outro exemplo:

192.168.16.0 com a máscara 255.255.255.224.

Logo, o último octeto da máscara é 224.

Então 256 – 224 = 32. Para saber o número de IPs disponíveis, você subtrai do resultado -2.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 503


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Esta rede tem então 32 - 2 = 30 Ips válidos. O intervalo será de 192.168.16.1 até
192.168.16.30.

Um exemplo agora com várias classes C:

10.0.0.0 com máscara 255.255.128.0.

Logo, o octeto será o segundo, com valor 128. Então 256 – 128 = 128 redes classe C, uma
vez que o último octeto é zero. Então o número de IPs disponíveis será (128 x 254)-2 =
32.766 endereços.

O intervalo será de 10.0.0.1 até 10.0.127.254.

CIDR
Outra forma de escrever a sub-rede é com a notação CIDR (Classless Inter-Domain Routing).
Esta notação escreve as máscaras com uma “/” seguida do número de bits de
endereçamento de rede.

Logo, uma classe C pode ser escrita da seguinte forma na notação CIDR:

192.168.1.0 com a máscara 255.255.255.0 será 192.168.1.0/24.

O /24 indica o número de bits que são do endereçamento de rede. Logo, dos 32 bits que
compõe o endereçamento IPv4, apenas 8 bits (32 - 24 = 8) são de endereçamento de
máquinas. Então, você deve elevar 2 ao número de bits de máquinas, menos 2, para saber o
número de Ips disponíveis em uma rede /24: (2^8)-2 = 254.

Veja agora uma rede com máscara /28. Teremos 32 bits menos 28, que é igual a 4 bits de
máquinas. (2ˆ4)-2 = 14 Ips válidos. Como essa rede tem 4 bits de máquinas, o tamanho da
rede será 16 (2ˆ4 = 16). Se você subtrair 256 – 16, irá achar 240. Então a máscara /28
também pode ser escrita na forma 255.255.255.240.

Uma rede com máscara /22 terá 10 bits de máquinas (32-22=10). Então esta rede terá
(2ˆ10)-2 = 1022 endereços disponíveis. Como essa rede tem 10 bits de máquinas, o tamanho
da rede será 1024 (2ˆ10). 1024 endereços dá 4 classes C (1024/256). Outra forma de
calcular é subtrair 8 bits (da classe C) dos 10 bits. Vão restar 2 bits. Então 2ˆ2 – 4. Logo, 256
- 4 é igual a 252. Então a máscara pode ser escrita na forma 255.255.252.0.

Seguindo este raciocínio, uma máscara 192.168.1.30/32 designa um único endereço IP, pois
32 bits menos 32 bits de rede é igual a zero. Logo, 2ˆ0 = 1.

Veja o último exemplo com a máscara /16. 32 bits menos 16 bits de rede é igual a 16. Então
esta rede terá (2ˆ16)-2 = 65.534 endereços disponíveis. Dos 16 bits de máquinas, 8 ficam no
quarto octeto e 8 no terceiro octeto. 2ˆ8 = 256. Então 256-256 = 0. Esta máscara pode ser
escrita também como 255.255.0.0.

Você precisa estar familiarizado com as máscaras de rede, com a notação CIDR e saber
calcular o número de Ips disponíveis para o exame.

504 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Pelo menos uma questão da prova envolve fazer estes cálculos. Então, para ganhar tempo,
sugiro você “decorar” as máscaras abaixo:

Decimal netmask CIDR Número de Ips Número de Hosts Válidos

255.0.0.0 /8 16.777.216 16.777.214

255.255.0.0 /16 65536 65534

255.255.240.0 /20 4096 4094

255.255.255.0 /24 256 254

255.255.255.192 /26 64 62

255.255.255.240 /28 16 14

255.255.255.248 /29 8 6

255.255.255.252 /30 4 2

255.255.255.255 /32 1 1

Localhost
Existem alguns endereços IP especiais que são reservados para funções específicas e que
não podem ser utilizados como endereços de rede.

Toda a Classe A 127.0.0.0 é utilizada como referência à própria máquina.

Em todo sistema operacional é criada uma Interface de rede de Loopback


chamada Localhost. Esta interface sempre terá o IPv4 127.0.0.1 e IPv6 ::1.

Esta interface terá sempre o nome "lo", indicando que é uma interface de loopback:

$ ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state
UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever

Geralmente qualquer serviço oferecido no host, também é oferecido na interface localhost,


mas nem sempre. O comando "ss -ltu" pode relatar isso:

$ ss -ltu

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 505


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Netid Local Address:Port


udp 0.0.0.0:openvpn
udp 127.0.0.1:323
udp [::1]:323
tcp 0.0.0.0:ssh
tcp 127.0.0.1:smtp
tcp 0.0.0.0:https
tcp 192.168.15.67:http
tcp [::]:ssh

É importante destacar algumas particularidades da resposta do comando ss:

0.0.0.0 no endereço da Interface quer dizer que o serviço está disponível em todas as
Interfaces IPv4;
[::] no endereço da Interface quer dizer que o serviço está disponível em todas as
Interfaces IPv6;
[::1] no endereço da Interface quer dizer que o serviço só está disponível no
Loopback IPv6;
127.0.0.1 no endereço da Interface quer dizer que o serviço só está disponível no
Loopback IPv4;
192.168.15.67 no endereço da Interface quer dizer que o serviço só está disponível
em uma determinada interface IPv4;

Por exemplo, um serviço de banco de dados MySQL conectado à um servidor Web local pode
ter habilitado somente a interface do localhost, de forma que somente a máquina local
poderá conectar no serviço. Dito isso, se um serviço somente estiver aceitando conexões na
interface de localhost, será impossível conectar de outra máquina nele.

Unix Sockets
Há outra maneira eficiente de se fazer conexões com serviços locais, chamados Unix
Sockets.

Os Unix Sockets são descritores de arquivos criados pela aplicação servidora que funcionam
como uma conexão de rede. Estes descritores de arquivos especiais fornecem uma
comunicação entre programas na mesma máquina via um processo chamado Inter-Process
Comunication (IPC).

Por ser mais simples, e não envolverem cabeçalhos IP, TCP, UDP, handshake e checksums
usados em uma comunicação com a interface localhost, os Unix Sockets são mais eficientes
e ainda permitem controle de acesso por usuário, já que são tratados no sistema operacional
como um arquivo.

O comando "ss -lx" mostra quais são os Unix Sockets abertos:

$ ss -lx

506 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Netid State Local Address:Port


u_seq LISTEN /run/udev/control
u_str LISTEN /var/run/acpid.socket
u_str LISTEN /var/run/rpcbind.sock
u_str LISTEN /var/lib/mysql/mysql.sock

Remote Direct Access Memory - RDMA


A tecnologia RDMA permite que os dados se movam da memória de um computador para
outro diretamente, com baixa latência e grande largura de banda, muito útil em um cluster
de computadores. Infelizmente esse tipo de acesso requer um hardware especializado.

É possível "emular" um RDMA através de uma interface de rede comum, disponível à partir
do Kernel 4.8.

Redes Privadas
Existem classes que são chamadas de IPs privados, pois são utilizadas em redes locais. Estas
classes privadas não são reconhecidas na Internet, e portanto não podem se conectar na
Internet sem o uso de um gateway ou dispositivo que faça a tradução dos IPs privados para
IPs públicos.

Como na versão 4 do IP não há endereços suficientes para todos os computadores e


dispositivos, o comitê gestor entendeu que algumas faixas de endereços podem ser usadas
em redes privadas, e que, quando estas se conectassem à Internet, haveria uma tradução
entre as redes privadas e públicas (Internet) que possibilitasse essa conexão. Os dispositivos
ou gateways que fazem essa tradução operam um mecanismo chamado NAT – Network
Address Translation.

O padrão RFC 1918 regula quais são as redes privadas do IPv4 e o padrão RFC 4193 regula
quais são os endereços privados da rede IPv6.

Para a prova é importante você reconhecer quais faixas são utilizadas em redes privadas:

Faixa de Endereços Número de IPs Descrição / Tamanho Bloco CIDR

10.0.0.0 – 10.255.255.255 16.777.216 Uma classe A 10.0.0.0/8

172.16.0.0 – 172.31.255.255 1.048.576 16 classes B 172.16.0.0/12

192.168.0.0 – 65.536 256 classes C 192.168.0.0/16


192.168.255.255

169.254.0.0 – 65,536 Uma classe B 169.254.0.0/16


169.254.255.255

Protocolos que Compõem o TCP/IP


O TCP/IP é constituído por um conjunto de protocolos que trabalham na camada de
transporte.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 507


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

A camada de transporte é responsável pelo controle da conversação entre as aplicações,


movimentação dos dados de maneira eficiente e confiável, independentemente da rede
física.

Ela garante que os dados tenham níveis de qualidade previamente negociados e que sejam
entregues ao seu destino sem erros, em sequência e em segurança.

Camada de Transporte
A camada de transporte utiliza basicamente dois protocolos para transferir informações: o
TCP e o UDP. O primeiro é orientado a conexão e o segundo é não orientado a conexão.
Ambos os protocolos podem servir a mais de uma aplicação simultaneamente.

Um protocolo orientado a conexão significa que ele negocia uma comunicação entre
transmissor e receptor, e mantém esta conexão ativa enquanto durar a conversa. Já um
protocolo não orientado a conexão simplesmente entrega seu conteúdo do transmissor para
o receptor, mas sem estabelecer uma conexão.

TCP - Transmission Control Protocol

O TCP é um protocolo da camada de transporte confiável, com conexão encapsulada no IP.


Esta conexão permite garantir a entrega dos pacotes, assegura a sequência correta e faz um
“checksum” que valida o cabeçalho e os dados do pacote.

No caso de a rede perder ou corromper um pacote TCP durante a transmissão, ele


retransmite o pacote, sem qualquer interferência da aplicação.

Essa confiabilidade torna o TCP/IP o protocolo escolhido para transmissões baseadas em


sessão, aplicativos cliente-servidor e serviços críticos.

Os cabeçalhos dos pacotes TCP requerem o uso de bits adicionais para assegurar sequência
correta da informação e o “checksum” obrigatório que garante a integridade do cabeçalho e
dos dados. Para garantia da entrega dos pacotes, o protocolo requisita que o destinatário
envie um pacote especial chamado de “acknowledgement” que confirma o recebimento.

UDP - User Datagram Protocol

O protocolo UDP não garante a entrega dos dados, pois não faz a checagem de recebimento.
Ele possui um “checksum” opcional que está dentro do seu próprio cabeçalho. É utilizado por
aplicações que geram altos volumes de tráfego na rede, como vídeo e som. Estas aplicações
não podem incorrer em atrasos na entrega dos pacotes, sacrificando a garantia de recepção.
Um streaming de vídeo que perder poucos pacotes UDP será imperceptível para o usuário.
Mas, se na transferência de um download faltar um arquivo, o mesmo será corrompido. Por
este motivo o TCP é utilizado para transferência de dados de forma confiável (mesmo que
mais lenta que o UDP) e o UDP é utilizado para streaming de conteúdo.

IP - Internet Protocol

O IP é o protocolo da camada Internet. Ele é responsável pela entrega de pacotes para todos
os outros protocolos da família TCP/IP. Ele utiliza um sistema de entrega de dados sem
conexão e trabalha com o endereçamento dos pacotes e seu roteamento.

508 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

ICMP - Internet Control Message Protocol,

O ICMP é um protocolo não orientado a conexão que funciona como um agente de controle
de informações, mensagens de erro e informações de rotas. Ele usa datagramas IP como
meio de transporte. O mecanismo de controle que emite mensagens quando acontece algum
erro é a função principal do protocolo ICMP. Suas funções básicas são:

Controle de Fluxo: Se o fluxo de entrada de dados for demasiadamente grande para


uma determinada máquina, ela pode emitir um pacote ICMP avisando o emissor para
parar temporariamente o envio de pacotes;
Destinos Inalcançáveis: Alguns dispositivos de rede, como roteadores, são capazes de
detectar falhas na entrega dos pacotes quando o destinatário não pode ser alcançado
por algum motivo. Eles enviam um pacote ICMP para o remetente avisando esta
condição;
Redirecionamento: Alguns dispositivos podem usar o ICMP para avisar o remetente
que utilize um outro caminho para alcançar o seu destinatário.
Checagem de Máquinas: Este protocolo também possibilita que a conexão entre
máquinas possa ser testada.

Figura 48 - Camada de Protocolos

Serviços e Portas TCP/IP


As aplicações fazem acesso à camada de transporte através de portas. Elas podem ser vistas
como canais de comunicações.

Cada porta é referenciada como número inteiro, que a identifica e à aplicação a que ela dá
suporte. Este número é um valor de 16-bit, que vai do 1 ao 65535 em decimal.

Os pacotes TCP e UDP contêm em seu cabeçalho informações como endereço IP do

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 509


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

remetente, porta de origem, endereço IP e porta de destino.

Cada serviço de rede oferecido por um computador deve utilizar uma porta de comunicação
exclusiva.

Os números de 1 a 1024 são chamados de portas privilegiadas porque os serviços oferecidos


através delas executam com autoridade de superusuário. Elas também são chamadas de
“portas bem conhecidas” porque são padronizadas para os mesmos serviços em vários
sistemas.

O arquivo /etc/services define os serviços e as portas conhecidas pelo sistema Linux. Veja as
portas cobradas no exame:

Porta Uso

20, 21 FTP (uma para dados, outra para controle)

22 SSH

23 Telnet

25 SMTP

53 DNS

80 HTTP

110 POP3

123 NTP

139 NetBIOS

143 IMAP

161, 162 SNMP

389 LDAP

443 HTTPS

465 SMTPS

636 LDAPS

993 IMAPS

995 POP3S

É importante que você tenha em mente a relação entre estas portas e os serviços oferecidos
por cada uma delas.

Quando uma máquina deseja abrir uma página de um site na Internet, ela abre uma conexão
entre ela e o servidor que hospeda a página. A máquina então abre uma conexão em uma
porta local, geralmente de número acima de 1024, e amarra essa porta local com o

510 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

programa do navegador web, com a porta 80 (http/tcp) do servidor em questão. Então


haverá, no momento da transferência do site, uma conexão entre uma porta local de uma
máquina e a porta 80 de um servidor.

No servidor, o programa que serve páginas web (servidor web Apache, por exemplo), fica
“escutando” a porta 80/tcp para aceitar novas conexões dos navegadores, porque
convencionou-se que este serviço trabalhe sempre na porta 80 do lado do servidor e utilize o
protocolo TCP para transferência de dados.

É certo que o arquivo /etc/services seja idêntico entre todos os Unix e Linux, pelo menos das
portas entre 1 e 1024.

Tabelas de Rotas
Para que as redes se interliguem e formem a Internet, cada dispositivo que interliga as
diferentes redes (conhecidos como gateways ou roteadores) é dotado de uma tabela de
rotas. Essa tabela de rotas especifica qual rede é conectada em qual interface do roteador.

Uma situação especial desta tabela é a rota padrão. Esta rota padrão diz ao roteador qual
será a interface para qual os pacotes deverão ir quando nenhuma ocorrência da tabela de
rotas satisfaz o destino do pacote. Na tabela de rotas convencionou-se o endereço 0.0.0.0/0
como sendo da rota padrão. Na notação CIDR 0.0.0.0/0 significa “todo o resto” ou “todas
as outras redes”.

Quando uma máquina transmite um pacote para outra máquina que não pertence à rede
local, ele é entregue para o roteador da rede. O roteador consulta sua tabela de rotas para
determinar de qual rede é o pacote. Se a rede à qual o pacote pertence não está na lista, o
pacote é entregue na interface indicada na rota padrão, que muito provavelmente é um
outro roteador ao qual o link está conectado.

Desta forma o pacote vai caminhando de roteador em roteador, até chegar na rede de
destino e então é entregue ao destinatário. Cada roteador por que o pacote passa é chamado
de salto ou hops. Convencionou-se na rede IPv4 que um máximo de 32 saltos atinja 99% de
alcance.

Cada vez que um pacote passa por um salto, é incrementado um contador especial no
pacote que conta quantos saltos ele já deu. Se um pacote não é entregue em até 32 saltos,
ele pode ser descartado pelo próximo roteador que passar, de forma que não fique vagando
eternamente na Internet.

IPv6

O número de endereços de rede IPv4 está acabando. Isto se deve principalmente porque a
Internet como conhecemos atualmente não foi projetada para ser uma rede comercial, mas
acadêmica.

O IPv6 é a versão nova do protocolo IP que vem com o propósito de trazer inúmeras
melhorias à pilha de protocolo, bem como comportar mais endereços.

O IPv6 está sendo implantado gradativamente na Internet e deve funcionar lado a lado com o

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 511


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

IPv4, numa situação tecnicamente chamada de “pilha dupla” por algum tempo. A longo
prazo, o IPv6 tem como objetivo substituir o IPv4.

Veja as principais melhorias propostas pelo IPv6:

Espaço de Endereçamento maior: Os endereços IPv6 têm um tamanho de 128 bits,


contra os 32 bits do IPv4.
Autoconfiguração de endereço: Suporte para atribuição automática de endereços
numa rede IPv6, podendo ser omitido o servidor de DHCP a que estamos habituados
no IPv4.
Endereçamento hierárquico: Simplifica as tabelas de encaminhamento dos roteadores
da rede, diminuindo assim a carga de processamento dos mesmos.
Novo formato do cabeçalho: Totalmente remodelados em relação ao IPv4.
Cabeçalhos de extensão: Opção para guardar informação adicional, principalmente
para comportar Qualidade de Serviço.
Suporte a qualidade diferenciada: Aplicações de áudio e vídeo passam a estabelecer
conexões apropriadas tendo em conta as suas exigências em termos de qualidade de
serviço (QoS).
Capacidade de extensão: Permite adicionar novas especificações de forma simples.
Encriptação: Diversas extensões no IPv6 permitem o suporte para opções de
segurança como autenticação, integridade e confidencialidade dos dados.

O endereçamento no IPv6 é de 128 bits, e inclui prefixo de rede e sufixo de host. No entanto,
não existem classes de endereços, como acontece no IPv4. Assim, a fronteira do prefixo e do
sufixo pode ser em qualquer posição do endereço.

Um endereço padrão IPv6 deve ser formado por um campo provider ID, subscribe ID, subnet
ID e node ID. Recomenda-se que o último campo tenha pelo menos 48 bits para que possa
armazenar o endereço MAC.

Os endereços IPv6 são normalmente escritos como oito grupos de 4 dígitos hexadecimais.
Por exemplo,

3ffe:6a88:85a3:08d3:1319:8a2e:0370:7344

Se um grupo de vários dígitos seguidos for 0000, pode ser omitido. Por exemplo:

3ffe:6a88:85a3:0000:0000:0000:0000:7344

É o mesmo endereço IPv6 que:

3ffe:6a88:85a3::7344

512 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Largura de Banda
Uma rede de comunicação pressupõe que há um meio em interligue os mensageiros. Esse
meio pode ser feito com cabos coaxiais, cabos UTP, par trançado, fibras óticas e até mesmo
através de ondas de rádio (Wifi). A quantidade de sinais por segundo que o meio é capaz de
transmitir, sejam eles elétricos, óticos ou ondas de rádio, determina a largura de banda.

Largura de banda é então um termo que define a quantidade máxima de Bits por segundo
que uma rede de dados é capaz de suportar.

Uma rede com largura de banda de 1 Mbps é capaz de transferir 1 Megabit por segundo.
Convencionou-se que o "b" minúsculo se refere a bits, e o "B" maiúsculo se refere a Bytes.
Como são necessários 8 bits para formar um Byte, uma rede de 1 MBps transfere na
realidade 8 Mbps.

Fazendo uma analogia com uma rodovia, a Largura de banda é um misto de número de
faixas da rodovia em conjunto com a velocidade máxima permitida.

Taxa de Transferência
A Largura de Banda pode dar uma referência da capacidade máxima de transmissão de bits
ou Bytes por segundo.

No entanto, para transferir dados em uma rede, há protocolos que definem como se dará
essa transmissão. Existe o protocolo da camada física (geralmente Ethernet), protocolo da
camada de Rede (geralmente IP), Protocolo da camada de transporte (geralmente TCP/UDP)
e ainda o protocolo da camada de aplicação (HTTP, SSH, etc).

Cada protocolo tem o seu cabeçalho, que carrega informações importantes, que aumenta o
tamanho do pacote final.

Figura 49 - Cabeçalho x Carga

Então, para se calcular a a taxa de transferência (throughput), é necessário desconsiderar


todos cabeçalhos de cada camada e tambem o congestionamento da rede.

Por exemplo, considerando uma conexão de 1 Mbps, sem congestionamento, e que os


cabeçalhos ocupam 1% dos bits transferidos, a taxa de transferência real será de 1.012 bps.

A Largura de banda é a taxa máxima de transferência e a Taxa de Transferência (throughput)


é a velocidade real.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 513


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Fazendo a mesma analogia com uma rodovia, a taxa de transferência é a velocidade real que
os carros podem transitar nela, levando-se em conta os carros quebrados, buracos na via,
curvas acentuadas, etc.

iperf

O pacote iperf pode ser usado para se descobrir a taxa de transferência entre dois pontos na
rede local ou na Internet.

O pacote pode ser instalado com o gerenciador de pacotes "apt install iperf" para
Debian/Ubuntu e "yum install iperf" para Redhat/Centos/Fedora.

Ele precisa ser instalado nas duas máquinas, uma vez que em uma ponta ele será executado
como servidor, e na outra como cliente.

Na máquina que será o servidor, o comando é "iperf -s":

servidor $> iperf -s

Na máquina que será o cliente, deve-se informar o IP do servidor:

cliente $> iperf -c 192.168.15.66


------------------------------------------------------------
Client connecting to 192.168.15.66, TCP port 5001
TCP window size: 85.0 KByte (default)
------------------------------------------------------------
[ 3] local 10.211.55.77 port 45166 connected with 192.168.15.66
port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 829 MBytes 695 Mbits/sec

No exemplo, o iperf transferiu 829 Mbytes, a uma taxa de 696 Mbits.

Saturação ou Congestão
A saturação é uma situação em que o tráfego de rede ultrapassa a sua capacidade. Isso pode
acontecer quando vários hosts resolvem enviar seus pacotes ao mesmo tempo. Haverá
portanto perda de pacotes, retransmissões, colisões de pacotes, etc.

Na mesma analogia da rodovia, a saturação ocorre quando muitos carros resolvem sair no
mesmo horário e passar na mesma rodovia.

Um sinal de congestão da rede local é o número grande de erros de trasmissão de pacotes,


além da latência maior que 3ms para um ping em hosts locais.

Isso porque a tecnologia Ethernet utilizada na maioria das redes locais utiliza um mecanismo
de detecção de colisões de pacotes chamado CSMA/CD. Quando ocorre uma colisão, o pacote
precisa ser retransmitido. Então o algoritmo fica escutando o meio, e quando percebe que há
514 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

um "silêncio", transmite na sorte, esperando que ninguém também transmita ao mesmo


tempo. Em um meio saturado há pouco silêncio, e por isso, muitras retransmissões.

o comando "netstat -i" pode trazer o número de erros de transmissão:

$ netstat -i
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR
eth0 9001 6889821 0 0 0 5725478 0 0 0
lo 65536 2153772 0 0 0 2153772 0 0 0

As colunas deste comando podem dar pistas importantes, tais como:

MTU - Maximum Transmission Units: Significa o máximo de bytes que uma


interface é capaz de mandar de em um só pacote, sem precisar dividi-lo. Quanto
maior o MTU, menos pacotes um host precisa mandar;
TX-OK: Quantidade de pacotes que foi transmitido com sucesso;
RX-OK: Quantidade de pacotes que foi recebido com sucesso;
TX-ERR e RX-ERR: Quantidade de pacotes recebidos ou transmitidos, mas com
checksum errado. O pacote chegou, mas com erros. Significa que há problemas na
conexão. Cabos com defeito, Wifi congestionado, placas de rede com defeito,
aterramento elétrico mal feito, cabos de rede perto demais de cabos de energia
elétrica podem causar isso;
TX-DRP e RX-DRP: Número de pacotes perdidos devido ao buffer (espaço de
memória de espera para processamento) estar cheio. Isto significa que pacotes
demais chegaram em um curto espaço de tempo.
TX-OVR e RX-OVR: Pacotes perdidos devido ao Kernel não conseguir processá-los a
tempo. O transmissor de um pacote espera por um certo tempo pela confirmação de
entrega. Se ela não chega, ele assume que o pacote se perdeu, e retransmite. Isto
acontece quando o host está muito ocupado.

Se os números de erros ERR e DRP estão crescendo, há algo de errado com sua rede.

Com mesmo efeito, o comando "ip -s link" mostra as mesmas estatísticas, com novidades:

$ ip -s link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
RX: bytes packets errors dropped overrun mcast
4260674914 2154948 0 0 0 0
TX: bytes packets errors dropped carrier collsns
4260674914 2154948 0 0 0 0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001
link/ether 0a:74:a3:2d:80:8f brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped overrun mcast
9474222539 6896237 0 0 0 0

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 515


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

TX: bytes packets errors dropped carrier collsns


5541342076 5733121 0 0 0 0

O moderno comando "ip" é capaz de trazer dois novos elementos estatísticos de problemas
de rede:

carrier: Quantidade de pacotes perdidos por problemas de desconexão do link de


rede. Pode ser mal contato no cabo ou conetor, mal contato na porta ethernet, perda
de sinal em cado de wifi.
collsns: Quantidade de colisões na ethernet ao transmitir um pacote. Pode significar
uma saturação na rede.

Latência

Latência ou "Lag" é o tempo que um pacote leva para sair do emissor e chegar no receptor.
Uma rede com grande latência é uma rede lenta, e pode significar largura de banda baixa,
saturação da rede e roteadores congestionados.

O comando ping testa a latência de uma rede, medindo o tempo que um pacote leva para
chegar ao destinatário e voltar.

Em uma rede local simples, um tempo médio maior que 3ms para o ping, pode significar
congestionamento da rede, ou saturação do host de destino.

$ ping 192.168.15.1
PING 192.168.15.1 (192.168.15.1): 56 data bytes
64 bytes from 192.168.15.1: icmp_seq=0 ttl=64 time=2.925 ms
64 bytes from 192.168.15.1: icmp_seq=1 ttl=64 time=2.899 ms
64 bytes from 192.168.15.1: icmp_seq=2 ttl=64 time=2.647 ms

O ping mostra a latência (tempo que o pacote pode demorar para ir e voltar).

O comando traceroute mostra todos os hosts que o pacote passa para chegar ao
destinatário, e a latência daquele host para o próximo.

$ traceroute 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
1 216.182.224.54 12.615 ms
2 100.66.12.206 12.556 ms
3 100.66.11.106 16.458 ms
4 100.66.7.15 18.708 ms
5 100.66.5.81 13.294 ms
6 100.65.15.1 0.330 ms
7 52.93.28.91 3.368 ms
8 100.100.2.34 0.488 ms
516 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

9 99.82.181.25 0.842 ms
10 * * *
11 dns.google 0.567 ms

Se o tempo de resposta de um host for maior que 5 segundos, o traceroute ignora,


imprimindo um "*" no lugar.

TTL - Time To Live


Cada pacote que é transmitido ganha no seu cabeçalho uma informação chamada TTL
(Tempo de vida de um pacote) que é um número que vai de 0 até 30. Geralmente um pacote
ganha um TTL igual a 30 quando é transmitido.

Em cada host que o protocolo passa, o seu número de TTL é decrescido em uma unidade.
Quando ele chega a zero, o pacote é descartado e uma mensagem é enviada ao
transmissor.

Assim, o TTL define o número máximo de hosts que um pacote pode passar até ser
descartado. Isto evita que um pacote que não encontre seu destinatário fique vagando na
rede eternamente.

O traceroute envia vários pacotes, com número de TTL começando em 1, e vai aumentando
o TTL em cada transmissão até que o último pacote chegue ao destino ou com TTL até 30.

Desta forma, o traceroute faz com que cada pacote chegue até o host seguinte, um por um,
como se subisse de cada vez um degrau a mais de uma escada, e usa diferença do tempo
da transmissão do pacote e do recebimento da mensagem que diz que o pacote foi
descartado ou que chegou ao destinatário.

Roteadores
Cada host que um pacote passa até chegar ao destinatário é de certa forma, um roteador de
pacotes. Esses elementos de rede podem ser um computador com várias placas de rede
ligadas a vários segmentos diferentes de rede, ou um equipamento especializado para
conectar redes através de links físicos, que podem ser linhas analógicas, cabo coaxial, fibra
ótica, rádio, etc.

Os roteadores utilizam uma Tabela de Rotas, que tem os endereços IP das redes em que
estão conectados. Desta forma, eles sabem para qual rede um pacote precisa ser
transmitido, via um determinado link.

Quando o roteador não tem a rede do destino do pacote em sua tabela, ele envia o pacote
para o link definido como "rota padrão" (default route), na esperança que o próximo
roteador saiba para onde o pacote deve ser enviado.

Como os roteadores lidam com muitos pacotes em suas várias intefaces, elas utilizam um
espaço de memória chamado buffer para armazenar a fila de pacotes que chegam ou saem,
até que estes sejam transmitidos na interface correta.

Você pode entender os roteadores como um aeroporto. Cada rede local (cidade) tem pelo

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 517


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

menos um. Os aviões representam os links que transmitem os pacotes (pessoas) até o
próximo roteador (aeroporto). Se a pessoa for descer nessa cidade (rede destino), o roteador
(aeroporto) entrega os passageiros para os taxis ou ônibus. Se o destino da pessoa não for
aquele aeroporto, ela toma outro vôo de conexão, até chegar ao seu destino.

Em cada roteador que o pacote passa, ele pode sofrer atrasos (vôo atrasado) ou descartado
devido a saturação do meio, ou porque sua memória está cheia com excesso de pacotes
(overbook do avião).

Demora na conexão
Uma conexão pode sofrer com demora por diversas razões:

Demora na resolução de nomes

O servidor de DNS responsável por traduzir um endereço para um IP pode demorar a


responder, gerando atraso no início da conexão.

Neste caso o comando "host -v" pode dar pistas do tempo de demora na resolução de
nomes:

$ host -v google.com
Trying "google.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56879
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0,
ADDITIONAL: 0
;; QUESTION SECTION:
;google.com. IN A
;; ANSWER SECTION:
google.com. 60 IN A
172.217.15.110
Received 44 bytes from 172.30.0.2#53 in 4 ms

Se o tempo de resposta do servidor de resolução de nomes for maior que 1 segundo, pode-se
experimentar outros servidores abertos na Internet, como o do Google (8.8.8.8) e o
CloudFlare (1.1.1.1).

É possível informar o IP do servidor de resolução de nomes como parâmetro do comando


host para testar diferentes servidores de DNS, antes de fazer a troca definitiva no arquivo
/etc/resolv.conf:

$ host -v google.com 1.1.1.1

O Systemd fornece serviço de resolução de nomes local, chamado systemd-resolved com


cachê dos nomes resolvidos. Pode-se constatar isso verificando o IP do servidor de nomes no
arquivo /etc/resolv.conf:

518 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

$ cat /etc/resolv.conf
nameserver 127.0.0.53
search localdomain

Os aplicativos locais podem enviar solicitações de resolução de nomes de rede para o


Systemd-resolved por meio de três interfaces:

Através de uma interface de programação API totalmente nativa que possui funções
de programação para resolução de nomes;
Através de uma interface de programação da biblioteca de programação C++ glibc;
Através de um servidor de DNS local que funciona como um cachê, que responde no
endereço IP 127.0.0.53 na interface de loopback local;

Para verificar se o serviço está ativo, pode-se usar o comando "systemctl status systemd-
resolved":

$ systemctl status systemd-resolved


● systemd-resolved.service - Network Name Resolution
Loaded: loaded (/lib/systemd/system/systemd-resolved.service;
enabled; vendor
Active: active (running) since Tue 2019-12-31 15:18:34 -03; 4
days ago
Docs: man:systemd-resolved.service(8)

https://www.freedesktop.org/wiki/Software/systemd/resolved

https://www.freedesktop.org/wiki/Software/systemd/writing-networ
k-con

https://www.freedesktop.org/wiki/Software/systemd/writing-resolv
er-cl
Main PID: 355 (systemd-resolve)
Status: "Processing requests..."
Tasks: 1 (limit: 1104)
CGroup: /system.slice/systemd-resolved.service
└─355 /lib/systemd/systemd-resolved

O comando "ss -lu" pode ser usado para se verificar se o serviço de resolução de nomes está
escutando na porta UDP 53 do localhost:

# ss -lu
State Local Address:Port Peer Address:Port

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 519


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

UNCONN 127.0.0.53%lo:domain 0.0.0.0:*

Rede local saturada


A rede local pode estar sofrendo com execesso de pacotes e retransmissões. Neste caso o
comando "ip -s link" pode fornecer pistas de saturação da rede.

Firewall saturado

O firewall que interliga a rede local à internet pode estar sobrearregado com excesso de
pacotes, ou com CPU sobrecarregada por algum processamento de regras ou software de
cachê, gerando lentidão para entregar os pacotes ao roteador.

Neste caso, é interessante verificar:

Se a interface de rede do firewall não está saturada com o comando "ip -s link";
Se a CPU do Firewall não está sobrecarregada com o comando "w" e "top";
Se o disco do Firewall não está cheio com o comando "df -h";
Se a memória do Firewall não está esgotada com o comando "free -h";
Se o Firewall está fazendo muito swap de disco, com o comando "free -h";
Se não há um número excessivo de conexões com o comando "ss -tunel";
Se não tem uma host na rede consumindo toda a banda com o comando "iptraf".

Roteador saturado

O firewall que interliga a rede local à Internet pode estar saturado de pacotes, ou com pouca
memória para o seu buffer, gerando atrasos e retransmissões.

A maioria dos roteadores oferece suporte ao protocolo SNMP (Simple Network Management
Protocol). Este protocolo pode fornecer estatísticas das interfaces do roteador. Softwares de
monitoramento como o Zabbix e MRTG podem gerar gráficos das interfaces do roteador.

A maioria dos roteadores tem habilitado a comunidade SNMP "public". O pacote snmpcheck
pode ser útil para testar a comunicação com o snmp:

$ snmpcheck 192.168.15.1

Link da rede local para Internet saturado

O link que interliga a rede local à Internet pode estar saturado, que causa atrasos na entrega
dos pacotes. Novamente, o protocolo SNMP pode fornecer estatísticas para gerar gráficos do
acesso ao link de Internet.

Tempo Esgotado
Uma conexão pode falhar por tempo esgotado por vários motivos:

520 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Problemas de resolução de nomes

Se houver algum problema com a resolução de nomes, a conexão sofrerá com um tempo
esgotado.

A maneira mais fácil de testar a resolução de nomes é com o comando "host":

$ host google.com
;; connection time out;

Se o comando host não for capaz de resolver o nome, verifique qual a política das chains
INPUT e OUTPUT:

# iptables -S | grep -e "-P"


-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT

Se as chains INPUT e OUTPUT estiverem com a política ACCEPT, você não pode encontrar
nenhuma regra DROP ou REJECT nas portas 53, porque ai haverá um filtro:

# iptables -S | grep "53" | grep -v ACCEPT

A opção "-v" do grep mostra todas as linhas que não contém a palavra ACCEPT.

Se as chains INPUT e OUTPUT estiverem com a política DROP, é obrigatório que se tenha
regras liberando o acesso nas portas 53 e 5353:

# iptables -S | grep "53"


-A INPUT -p udp --sport 5353 -j ACCEPT
-A INPUT -p udp --sport 53 -j ACCEPT
-A INPUT -p udp --dport 53 -j ACCEPT
-A OUTPUT -p udp --dport 53 -j ACCEPT
-A OUTPUT -p udp --sport 53 -j ACCEPT

Caso não seja um problema de filtros do Netfilter, é preciso checar se o servidor de DNS está
ativo com um ping:

$ ping 192.168.15.1

Se não houver um problema de conectividade entre o host e o servidor de DNS local, pode
ser que haja um filtro no Firewall, impedindo o servidor de DNS resolver nomes.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 521


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Desta forma, pode-se testar se o host é capaz de resolver nomes com um servidor de DNS
público externo:

$ host google.com 8.8.8.8


Using domain server:
Name: 8.8.8.8
Address: 8.8.8.8#53
Aliases:
google.com has address 216.58.202.238
google.com has IPv6 address 2800:3f0:4004:800::200e

Se o host for capaz de resolver com DNS público, o problema está no seu servidor de DNS. A
primeira solução é configurar o host para resolver com o DNS externo, alterando o arquivo
/etc/resolv.conf.

A segunda solução e atuar no servidor de DNS local para testar porque ele não resolve os
nomes.

O comando "dig" e "nslookup" já apresentados no livro podem auxiliar no diagnóstico do


servidor de nomes.

Se o host não for capaz de resolver com DNS público, teste se há conectividade entre a
máquina e o servidor de DNS:

$ ping 8.8.8.8

Se o ping responder, há um filtro na porta 53 UDP no Firewall. Se o ping não responder, pode
ser também um filtro de ICMP, ou um problema de conectividade da rede.

Endereço IP incorreto

Neste caso, como o endereço IP está incorreto, não haverá mesmo conexão.

Serviço no host destino não funcionando

Este é um caso em que o endereço do destino está correto, mas não há conexão. A falha
pode ser que o serviço não está ativo no host destino, ou há um filtro na rede para a
determinada porta.

Neste caso, pode-se testar a conexão com o host na porta desejada com o comando nmap:

# nmap 192.168.15.57 -p 80
Starting Nmap 7.70 ( https://nmap.org ) at 2020-01-04 12:38 -03
Nmap scan report for 192.168.15.57
Host is up (0.033s latency).
PORT STATE SERVICE
80/tcp closed http
522 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

Nmap done: 1 IP address (1 host up) scanned in 0.67 seconds

Neste caso o host está ativo, mas o serviço na porta 80, não.

Bloqueio de Firewall

Um serviço pode estar ativo no host destino, mas um bloqueio de firewall pode ocorrer entre
o host e o servidor. Este bloqueio pode estar em qualquer ponto. O comando nmap é capaz
de indicar isso:

$ nmap 192.168.15.60 -p 80
Starting Nmap 7.70 ( https://nmap.org ) at 2020-01-04 12:33 -03
Nmap scan report for 192.168.15.60
Host is up (0.15s latency).
PORT STATE SERVICE
80/tcp filtered http
Nmap done: 1 IP address (1 host up) scanned in 0.63 seconds

Neste exemplo, pode-se ver que o host destino está ativo, mas o serviço na porta 80 está
bloqueado. Este tipo de bloqueio pode ser na rede de origem, ou em algum ponto pelo
caminho.

Congestionamento na rede

O congestionamento na rede pode causar atrasos ao ponto da conexão sofrer com tempo
esgotado. O comando traceroute ou tracepath pode indicar isso, se houverem muitos "no
reply":

$ tracepath serversrv1.com
1?: [LOCALHOST] 0.007ms
1: 2804:7f2:2891:1dd8:1272:23ff:fee9:817a 2.981ms
1: 2804:7f2:2891:1dd8:1272:23ff:fee9:817a 2.880ms
2: 2804:7f2:2891:1dd8:1272:23ff:fee9:817a 3.014ms
2: 2804:7f4:2000:1::e7 4.373ms
3: 2804:7f4:2000:1000::7bf 6.041ms
4: 2001:12e0:100:4021:a006:4021:a002:1 5.783ms
5: 2001:12e0:100:4021:a090:4022:a090:b 14.389ms
6: 2001:12e0:100:4022:a090:4022:a001:f 16.358ms
7: no reply
8: no reply
9: no reply
10: no reply
11: no reply

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 523


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Ferramentas de Diagnóstico de Rede

Há alguns anos o Linux utilizava um conjunto de ferramentas do pacote legado chamado


Net-Tools. Este pacote possui algumas ferramentas clássicas para diagnosticar os
problemas de rede:

arp: ferramenta capaz de lidar com o cachê local de endereçamentos IP x Mac


Address;
ifconfig: ferramenta para configurar as interfaces de rede;
netstat: ferramenta para ver as estatísticas das interfaces e portas abertas;
route: ferramenta para ver e editar a tabela de rotas;

Essas ferramentas foram substituídas elegantemente por um novo pacote chamado


iproute2, através de um comando único chamado "ip".

Além destas ferramentas do Net-Tools e iptoute2, há outros pacotes interessantes para o


diagnóstico de redes como:

iptraf: analisa o tráfego de rede ou das interfaces;


nmap: utilizado para escaniar hosts e redes;
iftop: mostra o uso de banda de uma determinada interface;
iperf: faz diagnóstico da taxa de transferência entre dois hosts;
tcpdump: faz um dump do conteúdo dos pacotes e cabeçalhos para análise;
netcat: considerado o canivete suíco para diagnóstico de redes;
mtr: combina o traceroute e o ping em uma única ferramenta;
Wireshark/tshark: ferramenta de diagnóstico de redes;

Essas ferramentas nem sempre estão instaladas como padrão no sistema, de forma que
pode ser preciso a instalação do pacote com o seu nome, utilizando-se os gerenciadores de
pacotes.

traceroute e traceroute6
# traceroute [opções] ip

Este comando retorna os endereços das máquinas e outros dispositivos de rede por onde os
pacotes passam para chegar a um determinado destino. Este caminho é conhecido como
rota de endereços.

O traceroute também tem um executável próprio para operar no IPv6, chamado


traceroute6.

524 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

O traceroute utiliza o tempo de vida (TTL – Time To Live) dos pacotes IP para forçar uma
resposta do protocolo ICMP TIME EXCEEDED de cada dispositivo por onde o pacote passa
para obter as informações necessárias.

O tempo de vida determina o número máximo de dispositivos que um pacote pode percorrer
antes de ser apagado. Este parâmetro é necessário para que os pacotes não fiquem vagando
na rede para sempre se o seu destinatário não for encontrado.

O TTL padrão são 30 hosts.

As opções mais frequentes são:

-n: Esta opção desabilita a resolução de nomes;


-w seg: Esta opção altera o valor padrão do tempo de espera de retorno do pacote
ICMP de 5 segundos;
-f ttl: Esta opção altera o valor padrão de tempo de vida inicial de um pacote;
-m max: Altera o valor padrão do máximo de número de dispositivos que será testado
pelo traceroute.

Exemplo:

$ traceroute www.kernel.org
traceroute to www.kernel.org (204.152.189.116), 30 hops max, 40
byte packets
1 10.128.0.1 6.832 ms 8.702 ms 11.401 ms
2 10.11.0.254 13.013 ms 6.261 ms 6.993 ms
3 INF001010.enl-int.redeinfovias.net.br (200.150.1.10) 72.771
ms 71.875 ms 70.068 ms
(...)
13 r7-2.r8.pao1.isc.org (192.5.4.225) 236.927 ms 234.988 ms
232.748 ms
14 r8-pao1.r3.sfo2.isc.org (192.5.4.233) 225.628 ms 214.758
ms 214.469 ms
15 zeus-pub.kernel.org (204.152.189.116) 216.677 ms 219.898
ms 221.776 ms

tracepath e tracepath6
$ tracepath ip

O tracepath traça um caminho entre o host e um endereço de rede e tenta descobrir qual é o
MTU (Unidade Máxima de Transmissão). O tracepath é um bom substituto do traceroute.

Ele também tem um comando similar para o IPv6: tracepath6.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 525


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Exemplo:

$ tracepath www.kernel.org
1: ns1.certificacaolinux.com.br (72.26.225.74) 0.306ms pmtu
1500
1: 72-26-224-1.meganetserve.net (72.26.224.1) 134.005ms
2: no reply
3: no reply
4: no reply
5: isc.sjc06.atlas.cogentco.com (154.54.13.218) 5.693ms
6: int-0-2-0.r1.pao1.isc.org (149.20.65.18) asymm 4
5.010ms
7: pub2.kernel.org (204.152.191.37) asymm 5
3.635ms reached
Resume: pmtu 1500 hops 7 back 5

Ele tenta achar o tempo médio de resposta de cada passo no caminho e retorna o MTU final,
o número de hosts para os pacotes irem do host para o destino e tenta prever o número de
hosts do destino até o host se a rota for assimétrica (houver mais de um caminho).

Portas Abertas com netstat, ss e lsof

Parte do diagnóstico de rede, é verificar os serviços com portas abertas.

Para verificar as portas em aberto com o netstat, as opções "-tunl" podem ser usadas -t
para TCP,-u para UDP,-n para não resolver nomes e -l para as portas abertas (listen):

$ netstat -tunl
Active Internet connections (only servers)
Proto Local Address Foreign Address
tcp 127.0.0.53:53 0.0.0.0:*
tcp 0.0.0.0:22 0.0.0.0:*
tcp6 0 :::22 :::*
udp 127.0.0.53:53 0.0.0.0:*

O netstat com a opção -p mostra os processos donos das portas. Para utilizar essa opção é
preciso ser o root:

$ sudo netstat -tunlp

526 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Active Internet connections (only servers)


Proto Local Address State PID/Program name
tcp 127.0.0.53:53 LISTEN 24813/systemd-resol
tcp 0.0.0.0:22 LISTEN 9857/sshd
tcp6 :::22 LISTEN 9857/sshd
udp 127.0.0.53:53 24813/systemd-resol

O comando ss também pode mostrar as portas abertas com a opção idêntica:

# ss -tunelp
Netid Local Address:Port Peer Address:Port

udp 127.0.0.53%lo:53 0.0.0.0:* ("systemd-


resolve",pid=355)
udp 0.0.0.0:68 0.0.0.0:* ("dhclient",pid=17984)
udp 0.0.0.0:5353 0.0.0.0:* ("avahi-daemon",pid=27533)
tcp 0.0.0.0:22 0.0.0.0:* ("sshd",pid=14825)

lsof
$ lsof [opções]

Como tudo no Linux é um arquivo, também as conexões de rede podem ser visualizadas
como um "arquivo em aberto". O comando "lsof" pode ser usado neste contexto para ver os
arquivos que correspondem a endereços de Internet.

A opção "-i" do lsof filtra os arquivos em aberto do tipo de enderecos de Internet. É


necessário executar o lsof como root:

$ sudo lsof -i
COMMAND PID USER FD TYPE NODE NAME
sshd 9857 root 3u IPv4 TCP *:ssh (LISTEN)
sshd 9857 root 4u IPv6 TCP *:ssh (LISTEN)
systemd-r 24813 systemd-resolve 12u IPv4 UDP
localhost:domain
systemd-r 24813 systemd-resolve 13u IPv4 TCP localhost:domain
(LISTEN)

nmap
$ nmap [opções] alvo

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 527


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

O nmap é uma ferramenta poderosa para descobrir as portas abertas em hosts locais ou
remotos. Ele pode ser instalado com qualquer gerenciador de pacotes. Ao contrário das
ferramentas netstat, ss e lsof que verificam os sockets ou arquivos em aberto, o nmap faz
uma busca por portas em aberto pelo método "tentativa e erro", tentando se conectar nas
portas conhecidas, e se encontra uma aberta, ele verifica qual o tipo de serviço a porta
serve.

Exemplos:

Para verificar as portas abertas de 1 até 1000:

$ nmap localhost
Starting Nmap 7.70 ( https://nmap.org ) at 2019-10-23 06:01 -03
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000098s latency).
Not shown: 999 closed ports
PORT STATE SERVICE
22/tcp open ssh
Nmap done: 1 IP address (1 host up) scanned in 0.05 seconds

Um pequeno script pode ser escrito para comparar as portas em aberto em relação a um
arquivo prévio:

Primeiro deve-se criar o arquivo prévio para servir de comparação no futuro:

$ nmap localhost | grep open > original

O script abaixo executa o nmap, e compara o resultado com o arquivo "original". Se houver
diferença, um e-mail será enviado:

#!/bin/bash
nmap localhost | grep open > atual
diff original atual
if [ $? -eq 0 ]; then
echo “nada mudou”
else
mail uira@certificacaolinux.com.br < atual
fi

netcat
$ netcat [ opções ] ip [ porta ]

528 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

O comando netcat ou nc é um utilitário utilizado para fazer “quase tudo” quando se trata dos
protocolos TCP e UDP. Ele pode ser usado para abrir conexões TCP, enviar pacotes UDP,
escutar qualquer porta TCP ou UDP e escanear as portas abertas de um host.

Ele pode ser útil para servir de proxy simples de TCP, escrever scripts simples de HTTP
cliente e servidores, testar processos servidores de rede (daemons) e muitas outras funções.

Veja alguns exemplos de uso do netcat:

Para se conectar em algum host:porta utilizando o netcat, você deve fornecer o endereço do
host e a porta. É útil para ver se um determinado servidor está respondendo:

$ nc google.com 80
get ../..
HTTP/1.0 400 Bad Request
Content-Type: text/html; charset=UTF-8
Content-Length: 1419
Date: Tue, 14 Apr 2015 02:11:11 GMT
Server: GFE/2.0

Para utilizar o netcat como um processo que escuta em determinada porta e enviar o
resultado para um arquivo. É útil para saber o que uma aplicação cliente está mandando
para um determinado servidor:

$ nc –l –p 6565 > /tmp/arquivo.tmp

O netcat pode até mesmo ser utilizado para escutar em uma determinada porta e jogar o
resultado no terminal:

$ nc -l -vv 4343

O netcat pode ser utilizado para saber quais portas estão abertas em um determinado host. É
útil para verificar se um determinado serviço deveria ou não estar escutando na rede:

$ nc -vv -w1 google.com 20-443

Essa ferramenta pode tanto se comportar como uma aplicação servidora ou cliente, de modo
a testar os serviços oferecidos por um determinado servidor ou cliente.

iftop
$ iftop

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 529


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

O iftop é uma excelente ferramenta para analisar o tráfego de rede em tempo real. Ele
atualiza a tela para mostrar as conexões naquele determinado momento.

O iftop é ideal para verificar o tráfego em um Firewall de modo rápido para descobrir quem
está consumindo a largura de banda da Internet.

O iftop pode ser executado com o comando "iftop":

$ iftop

Figura 50 - Iftop

arp
$ arp

O comando arp manipula o cachê de ARP do sistema, para criar ou apagar um registro.

O Address Resolution Protocol é um protocolo que serve para resolver os endereços IP em


endereços de MAC Address das interfaces de rede. É este protocolo que "interliga" a camada
IP com a camada de Enlace, responsável pela entrega final de um pacote IP a uma
determinaa placa de rede.

Cada host conectado à uma rede local mantêm um cachê das máquinas que conhece da rede
local com seus respectivos IPs e endereços de MAC de placa de rede. Esse cachê é
530 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

alimentado automaticamente a partir das conexões do host com outras máquinas na mesma
rede, e é perdido quando o host é reiniciado.

O comando arp pode manipular esse cachê e isto é útil em duas situações:

Quando há um conflito de IPs na rede, devido a uma configuração errada de IP


manual. Não se pode ter dois IPs iguais na mesma rede;
Quando há uma troca da placa de rede de uma máquina, e portanto, mudança do
MAC Address, mas mantendo o mesmo IP. As máquinas podem não entender que um
determinado IP está com uma placa de rede nova.

Para mostrar o cachê do ARP:

$ arp -n
Address HWaddress
172.30.0.2 0a:55:14:8d:83:82
172.30.0.1 0a:55:14:8d:83:82

A opção "-d máquina" apaga uma determinada entrada no cachê do arp.

Equipamentos como Switch de rede também mantém um cachê de ARP, de modo que ele
encaminha um pacote de uma determinada porta do switch para a máquina ligada a porta de
destino, sem replicar os pacotes em todas as portas.

O comando "ip neigh" é o substituto do comando arp no pacote iproute2:

$ ip neigh
172.30.0.2 dev eth0 lladdr 0a:55:14:8d:83:82 STALE
172.30.0.1 dev eth0 lladdr 0a:55:14:8d:83:82 REACHABLE

mtr
$ mtr

O comando mtr combina as funcionalidades do ping e do traceroute para realizar


diagnósticos de rede. Assim como o iftop, ele atualiza a tela em tempo real.

O mtr envia pacotes com TTLs propositadamente baixos, de forma continua e registra os
tempos de resposta dos roteadores pelo caminho. Isto permite exibir os percentuais e
tempos de respostas até o destino.

Com o mtr pode-se saber de maneira visual onde há maior perda de pacotes.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 531


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Figura 51 - mtr

whois
$ whois endereço

O utilitário whois serve para buscar informações sobre um determinado um endereço IP ou


domínio nas bases de dados whois.networksolutions.com e whois.arin.net.

Ele pode ser útil para identificar os responsáveis por endereços IPs, ou domínios de Internet.

$ whois certificacaolinux.com.br
domain: certificacaolinux.com.br
owner: Uira Endy Ribeiro
country: BR
nserver: jill.ns.cloudflare.com
nsstat: 20200101 AA
nslastaa: 20200101
nserver: pete.ns.cloudflare.com
nsstat: 20200101 AA
nslastaa: 20200101
created: 20040624 #1700522
status: published

532 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Análise de Pacotes

As ferramentas Wireshark, tshark e tcpdump podem ser utilizadas para se fazer um


diagnóstico de rede aprofundado, visualizando os cabeçalhos e o conteúdo dos pacotes.

Wireshark
O pacote wireshark faz a captura e permite fazer o diagnóstico dos pacotes de rede num
ambiente gráfico Desktop.

Ele pode fazer a captura dos pacotes e análise em tempo real e com a possibilidade da
utilização de filtros.

Com o wireshark é possível controlar o tráfego de uma rede e monitorar a entrada e saída de
dados do host, filtrando diferentes protocolos da camada de transporte, como TCP, UDP,
ICMP, etc, bem como protocolos da camada de aplicações (HTTP, POP3, SSH, etc).

O Wireshark também é muito útil para se fazer diagnóstico fino em pacotes de Voz sobre IP,
para ajuste das configurações de telefonia IP.

Se executado em um Firewall, o Wireshark é capaz de capturar todo o tráfego que entra e saí
da rede, e realizar uma infinidade de diagnósticos.

O wireshark também é capaz de ler os pacotes capturados pelas ferramentas tshark e


tcpdump. Isso permite que os dados possam ser capturados em um host remoto, sem
ambiente gráfico, e analizados de forma "offline" no ambiente gráfico posteriormente.

Figura 52 - Wireshark

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 533


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

tshark
O utilitário tshark serve para capturar pacotes para posterior análise no Wireshark. Ele pode
ser utilizado por exemplo para captura remota de pacotes, em um host que não possui
ambiente gráfico para executar o Wireshark.

Exemplo:

$ tshark -i enp0s5 -c 3
Running as user "root" and group "root". This could be dangerous.
Capturing on 'enp0s5'
1 0.000000000 10.211.55.77 → 10.211.55.1 DNS 100 Standard
query 0x914d A connectivity-check.ubuntu.com OPT
2 0.000107773 10.211.55.77 → 10.211.55.1 DNS 100 Standard
query 0xd8bf AAAA connectivity-check.ubuntu.com OPT
3 0.006814258 10.211.55.1 → 10.211.55.77 DNS 132 Standard
query response 0x914d A connectivity-check.ubuntu.com A
35.222.85.5 A 35.224.99.156 OPT

A opção "-i" do tshark permite especificar a interface de rede, e a opção "-c" especifica a
quantidade de pacotes.

A opção "-w" permite salvar o dump de rede no formato pcap, que pode ser lido pelo
Wireshark:

$ tshark -i enp0s5 -c 50 -w capture-output.pcap

O tshark também pode ser usado para filtrar os pacotes de acordo com cabeçalhos e mostrar
o seu conteúdo. A opção "-Y" aplica um filtro de tipo de pacote. A opção "-T" diz para extrair
os dados do filtro, e a opção "-e" indica quais são os dados:

$ tshark -i enp0s5 -Y http.request -T fields -e http.host -e


http.user_agent

Neste exemplo, o tshark extrai os endereços HTTP solicitados e o User Agent.

tcpdump
O tcpdump também faz a captura de dados como o tshark.

Exemplo:

# tcpdump -i eth0 -c 3
tcpdump: verbose output suppressed, use -v or -vv for full
protocol decode
534 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

listening on eth0, link-type EN10MB (Ethernet), capture size


262144 bytes
20:49:03.462023 IP ip-172-30-0-203.ec2.internal.openvpn >
179.83.188.254.dynamic.adsl.gvt.net.br.52071: UDP, length 193
20:49:03.462104 IP ip-172-30-0-203.ec2.internal.openvpn >
179.83.188.254.dynamic.adsl.gvt.net.br.52071: UDP, length 193
20:49:03.463513 ARP, Request who-has ip-172-30-0-2.ec2.internal
tell ip-172-30-0-203.ec2.internal, length 28
3 packets captured
14 packets received by filter
0 packets dropped by kernel

Ele também permite a captura do tráfedo em uma deteminada porta, com a opção "port":

# tcpdump -i eth0 port 80

A opção "-w" permite salvar o dump de rede no formato pcap, que pode ser lido pelo
Wireshark:

# tcpdump -i eth0 -w registro.cap

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 535


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Monitoramento e Configuração de
Armazenamento

O armazenamento de dados é uma das áreas que podem impactar drasticamente o


funcionamento e o desempenho do sistema.

Os problemas de armazenamento tendem a se concentrar em falhas de hardware, latência


de E / S do disco e espaço em disco esgotado.

Para diagnosticar o espaço em disco, existem duas ferramentas: du e o df.

df
$ df [opções] [diretórios]

O comando df (disk free) mostra a capacidade utilizada de um sistema de arquivos em


termos de espaço e inodes.

Um inode é uma estrutura de dados que descreve um objeto do sistema de arquivos, que
pode ser uma de várias coisas, incluindo um arquivo ou diretório. Cada inode armazena os
atributos e a(s) localização(ões) de bloco de disco dos dados dos objetos. Atributos de objeto
do sistema de arquivos podem incluir metadados (horários de última alteração, acesso e
modificação), bem como dados de proprietário e permissão (por exemplo, id de grupo, id de
usuário, permissões).

Como o número de inodes está diretamente ligado ao número de arquivos que um dispositivo
pode armazenar, é possível que ele acabe e ainda tenhamos espaço disponível em disco. Isso
é raro, mas pode acontecer quando temos um número enorme de pequenos arquivos. O
número de inodes é definido na formação do disco.

Ele pode receber como parâmetro o sistema de arquivos que se deseja informações Se
nenhum nome de arquivo for fornecido, o df mostra o espaço disponível em todos os
sistemas de arquivos atualmente montados. O espaço em disco é mostrado em blocos de 1K
por padrão.

Neste exemplo o df mostra a capacidade do disco montado como raiz / :

$ df /
Sist. Arq. 1K-blocos Usado Disponível Uso% Montado em
/dev/mapper/cl-root 42954248 8079412 34874836 19% /

A opção -i do df mostra a quantidade de inodes disponível:

$ df -i /
536 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

Sist. Arq. Inodes IUsado ILivr IUso% Montado em


/dev/mapper/cl-root 21487616 174290 21313326 1% /

A leitura do espaço ocupado e disponível pode ser feita de forma mais fácil com a opção -h:

$ df -h /
Sist. Arq. Tam. Usado Disp. Uso% Montado em
/dev/mapper/cl-root 41G 7,8G 34G 19% /

Sem informar o arquivo, o df mostra a informação de todos os discos montados:

$ df -h
Sist. Arq. Tam. Usado Disp. Uso% Montado em
devtmpfs 979M 0 979M 0% /dev
tmpfs 996M 0 996M 0% /dev/shm
tmpfs 996M 420K 996M 1% /run
tmpfs 996M 0 996M 0% /sys/fs/cgroup
/dev/xvda1 8,0G 4,7G 3,4G 58% /
/dev/xvdf 20G 12G 7,4G 61% /home
tmpfs 200M 0 200M 0% /run/user/1000

du
$ du [opções] [diretórios]

O comando du (disk usage) vai fornecer uma lista detalhada sobre a utilização do disco.

É muito útil para determinarmos para onde foi o espaço disponível em disco, de forma que
você pode investigar qual diretório está consumindo o disco.

Se não passarmos um diretório como parâmetro, ele usa o diretório corrente como base de
pesquisa.

As opções mais frequentes são:

-a: Mostra todos os arquivos e não somente diretórios;


-c: Mostra um total no final da listagem;
-h: Mostra as informações de forma mais simples. Utiliza as letras M para megabytes
e G para gigabytes;
-s: Mostra um sumário do diretório especificado e não o total de cada subdiretório;
-S: Exclui os subdiretórios da contagem;

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 537


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Exemplos:

$ du –h /home
2M /home/carla
4M /home/cristiane
5M /home/guilherme
1M /home/michel

Com a opção -sh, ele mostra o totalizador, incluindo os subdiretórios:

$ du –sh /home
12M /home

Com a opção -Sh, ele mostra o totalizador, excluindo os subdiretórios:

$ du –Sh /home
1k /home

Se quiser saber o total de cada subdiretório:

$ du -sh ./*/
291M ./carlacru/
173M ./freud/
142M ./mario/
181M ./odonto/
273M ./oficina/

A opção --inodes mostra a contagem de inodes:

$ du -s --inodes ./*/
75 ./desafio/
15 ./funnel/
2 ./musicas/

Pode-se investigar todo o disco, desde a raiz / :

# du -sh ./*/
221M ./bin/
125M ./boot/
0 ./dev/
32M ./etc/
538 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

12G ./home/
513M ./lib/
219M ./lib64/
0 ./mnt/
0 ./proc/
145M ./root/
420K ./run/
43M ./sbin/
0 ./sys/
21M ./tmp/
527M ./usr/
2,8G ./var/

Observe que os pseudo-sistemas de arquivos como o /proc, /dev e /sys não ocupam espaço
em disco porque na realidade são abstrações do Kernel e subsistemas.

Estatísticas de Disco com iostat

O comando iostat fornece estatísticas de uso da CPU e taxas de leitura e gravação em disco.

O utilitário iostat faz parte do pacote sysstat e geralmente precisa ser instalado utilizando o
gerenciador de pacotes:

# apt install sysstat

Exemplo de uso:

# iostat
Linux 5.3.16-200.fc30.x86_64 (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.89 0.02 0.93 0.01 0.00 98.15
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 1.74 26.10 11.40 2319347 1013212
dm-0 1.76 24.95 8.88 2216729 789032
dm-1 0.24 0.27 0.72 24260 64168
dm-2 0.19 0.77 1.92 68249 170700

Este comando mostra as estatísticas desde o boot do sistema, a menos que a opção -y for
utilizada para informar o intervalo em segundos.

No caso dos discos, as colunas do iostat mostram as seguintes informações:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 539


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

TPS: transferências por segundo;


kB_read/s: KB lidos por segundo;
kB_wrtn/s: KB gravados por segundo;
kB_read: total de blocos lidos;
kB_wrtn: total de blocos gravados;

Para verificar situações específicas de desempenho do disco, pode-se usar o temporizador do


iostat:

$ iostat -y 10 3

O primeiro número (10) configura o intervalo em segundos entre as aferições, e o segundo


número (3) especifica a quantidade de aferições que o iostat irá fazer.

Para encontrar qual é o programa que consome grande parte do I/O de disco, pode-se usar o
utilitário iotop, que fornece uma lista ordenada dos programas que mais fazem operações de
leitura/gravação e também de swap.

Figura 53 - iotop

ioping
Enquanto o comando iostat fornece uma estatística dos da performande dos discos em
utilização real, o comando ioping pode servir para fazer testes de "stress" nos discos e
averiguar seu desempenho.
540 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

É uma ferramenta para se testar e comparar desempenho dos discos, especialmente após
fazer ajustes nas configurações de disco.

O ioping faz parte do pacote ioping e geralmente precisa ser instalado utilizando o
gerenciador de pacotes:

# apt install ioping

Exemplo de uso:

Para fazer testes de desempenho no disco e diretório local:

$ ioping .
4 KiB <<< . (ext4 /dev/sda1): request=1 time=102.5 us (warmup)
4 KiB <<< . (ext4 /dev/sda1): request=2 time=197.8 us
4 KiB <<< . (ext4 /dev/sda1): request=3 time=205.3 us
^C
--- . (ext4 /dev/sda1) ioping statistics ---
2 requests completed in 403.1 us, 8 KiB read, 4.96 k iops, 19.4
MiB/s
generated 3 requests in 2.54 s, 12 KiB, 1 iops, 4.73 KiB/s
min/avg/max/mdev = 197.8 us / 201.6 us / 205.3 us / 3.74 us

Para parar o teste, é necessário apertar Ctrl-C. Com a opção "-c" pode-se especificar o
número de testes que serão feitos. A medida de tempo do ioping é "us" que significa
microsegundos (1/1000000).

Para saber a taxa de busca do disco, pode-se usar a opção "-R":

# ioping -R /dev/sda1
--- /dev/sda1 (block device 64.0 GiB) ioping statistics ---
28.1 k requests completed in 2.88 s, 109.7 MiB read, 9.74 k iops,
38.0 MiB/s
min/avg/max/mdev = 29.9 us / 102.7 us / 2.32 ms / 109.9 us

Para se saber a taxa sequencial do disco, pode-se usar a opção "-RL":

# ioping -RL /dev/sda1


--- /dev/sda1 (block device 64.0 GiB) ioping statistics ---
9.55 k requests completed in 2.87 s, 2.33 GiB read, 3.33 k iops,
832.1 MiB/s
min/avg/max/mdev = 99.6 us / 300.5 us / 8.52 ms / 593.3 us

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 541


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

É preciso tomar cuidado com a opção de deste de desempenho do ioping com a opção "-w",
pois pode haver perda de dados. Consulte o manual do ioping.

Ajuste de desempenho de I/O

Todos os programas em execução podem em algum momento ler ou gravar dados no disco.
A organização de como os programas vão ler ou gravar dados no disco é feita pelo Kernel por
um algoritmo escalonador.

A necessidade do sistema operacional tratar de forma especial o processo de leitura e


gravação em disco com uma metodologia se deve ao fato dos discos rígidos e Solid State
Drives (SSD), computacionalmente falando, serem lentos demais.

Enquanto as CPUs e memórias RAM trabalham em nanossegundos, os discos e SSDs


trabalham em milissegundos. É uma diferença em escala de 1 milhão de vezes.

Os discos rígidos gravam os dados em setores em discos que giram em alta rotação por uma
cabeça magnética que percorre o disco. Para ler e gravar dados a cabeça precisa se
movimentar até um determinado raio, enquanto o disco gira até o setor determinado. Este
processo lento é chamado de busca (seeking).

Por se tratar de um processo lento, os computadores tentam organizar os dados no disco em


espaços contíguos, para evitar que a cabeça necessite se movimentar muito e demore mais
tempo.

Em dispositivos SSD, os dados são gravados em pilhas de células de memória flash,


agrupadas numa grade. Não há partes móveis, mas mesmo assim gravar os dados em forma
contigua acelera a leitura de alguma forma.

O Linux possibilita que se modifique a forma como os pedidos de gravação e leitura são
ordenados pelo Kernel. Cada método possui a sua forma única de agendar as leituras e
gravações e priorizar o acesso ao disco.

A mudança no algoritmo escalonador do disco pode ser feita em tempo real alterando-se o
arquivo em /sys/block/<nome do disco>/queue/scheduler:

# cat /sys/block/sda/queue/scheduler
noop deadline [cfq]

É importante destacar que a escolha do algoritmo escalonador é por disco.

Neste exemplo, o escalonador utilizado no disco sda é o cfq, selecionado pelas chaves [ ].

Há, portanto, três algoritmos para escalonar o acesso ao disco:

CFQ

O algoritmo Complete Fairness Queueing (CFQ) cria uma fila de entrada/saída de dados

542 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

para cada processo em execução. O objetivo aqui é ser o mais justo possível.

Então o CFQ ordena as filas para reduzir o máximo o processo de busca (seeking), e depois
processa as filas em partes iguais de modo circular (round-robin).

Em termos de desempenho, o CFQ tenda dar a cada processo a mesma prioridade de acesso
ao disco.

É um algoritmo bom quando se deseja balancear o acesso ao disco, e em máquinas


multiprocessadas.

Para se alterar o escalonador para CFQ em tempo real, pode-se mudar o valor no arquivo
correspondente ao disco:

# echo "cfq" > /sys/block/sda/queue/scheduler

Para averiguar o desempenho, pode-se usar o ioping com a opção "-RL":

# ioping -RL /dev/sda


--- /dev/sda (block device 64 GiB) ioping statistics ---
10.8 k requests completed in 2.94 s, 2.65 GiB read, 3.69 k iops,
922.9 MiB/s
min/avg/max/mdev = 103.6 us / 270.9 us / 18.6 ms / 510.8 us

DEADLINE

O algoritmo Deadline cria duas filas: uma de leitura e outra de gravação.

Quando uma requisição de E/S entra na fila, ela ganha uma data de expiração. Enquanto isso
o algoritmo Deadline tenta processar a fila da maneira mais eficiente possível. Quando a data
de expiração de uma requisição de E/S expira, ela ganha alta prioridade, e vai para o começo
da fila.

Os valores de expiração padrão para as requisições de E/S são 500ms para operações de
Leitura, e 5.000ms para gravação. Logo, este algoritmo é ótimo para ambientes cuja leitura
dos dados é mais importante do que a gravação.

O Deadline é um algoritmo interessante para se usar em servidores web e bases de dados


com poucas alterações.

Para se alterar o escalonador para Deadline em tempo real, pode-se mudar o valor no
arquivo correspondente ao disco:

# echo "deadline" > /sys/block/sda/queue/scheduler

Para averiguar o desempenho, pode-se usar o ioping com a opção "-RL":

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 543


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

# ioping -RL /dev/sda


--- /dev/sda (block device 64 GiB) ioping statistics ---
9.59 k requests completed in 2.89 s, 2.34 GiB read, 3.33 k iops,
831.3 MiB/s
min/avg/max/mdev = 94.9 us / 300.7 us / 14.1 ms / 622.8 us

NOOP

O algoritmo NOOP não prioriza nada. Ele simplesmente coloca todas as requisições em uma
única fila, ordenado por ordem de chegada (FIFO - First in First Out). O Noop é ideal para
hosts de máquinas virtuais, pois as requisições de E/S do Host e das máquinas virtuais serão
ordenadas na ordem que chegam.

Para se alterar o escalonador para Noop em tempo real, pode-se mudar o valor no arquivo
correspondente ao disco:

# echo "noop" > /sys/block/sda/queue/scheduler

Para averiguar o desempenho, pode-se usar o ioping com a opção "-RL":

# ioping -RL /dev/sda


--- /dev/sda (block device 64 GiB) ioping statistics ---
10.5 k requests completed in 2.83 s, 2.57 GiB read, 3.73 k iops,
932.6 MiB/s
min/avg/max/mdev = 95.6 us / 268.1 us / 14.9 ms / 447.4 us

Note que as mudanças no arquivo /sys/block/<disco>/queue/scheduler são aplicadas


imediatamente pelo Kernel, refletindo diretamente no desempenho do disco, mas não são
permanentes.

Alterando o algoritmo de E/S no Grub

Para que as alterações fiquem permanentes após o reinício do sistema, é necessário alterar a
configuração no GRUB.

O arquivo /etc/default/grub precisa ser alterado, especificamente adicionando o parâmetro


elevator na linha GRUB_CMDLINE_LINUX:

GRUB_CMDLINE_LINUX="elevator=deadline"

Depois de fazer a alteração, deve-se executar o comando update-grub2:

# update-grub2
Generating grub configuration file ...

544 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Found linux image: /boot/vmlinuz-4.15.0-34-generic


Found initrd image: /boot/initrd.img-4.15.0-34-generic
Found memtest86+ image: /boot/memtest86+.elf
Found memtest86+ image: /boot/memtest86+.bin
done

Nosso teste demonstrou que o algoritmo com melhor desempenho foi o Noop. Isto não
significa que ele seja melhor, mas que apenas foi melhor no teste realizado. O melhor
algoritmo vai depender muito da aplicação para qual o Linux serve.

Falhas de Disco

Falhas de disco são mais comuns do que gostaríamos.

É possível que um HD falhe como um todo, possívelmente ocasionado por um problema na


placa controladora. Quando isso acontece, não há muito o que fazer.

O mais comum são pequenas falhas em setores do disco, que são marcados pela
controladora como "bad sector". Quando isso acontece, o setor não é mais utilizado, e seus
dados podem ser movidos para um outro setor bom.

Quando um disco comecá a apresentar muitos setores ruins, é um sinal de que sua vida útil
está chegando ao fim.

Os SSDs também não estão imunes a problemas e falhas, já que as células de memória
também podem falhar.

Independente dos discos, os sistemas de arquivos podem ter estratégias diferentes para
verificar e corrigir erros. Os sistemas de arquivos baseados em Journaling (ext3, ext4, btrfs,
xfs) são mais seguros contra perda de dados, pois podem utilizar vários setores no disco
como o journal.

De qualquer forma, o Linux conta com ferramentas para tentar realizar checagem e reparos
nos sistemas de arquivos:

Ferramenta Utilidade

fsck Ferramenta para reparo em sistemas de arquivos ext2, ext3 e ext4.

xfs_check e xfs_repair Ferramenta para reparo no sistema de arquivos xfs.

btrfs-check Ferramenta para reparo no sistema de arquivo btrfs.

partprobe Ferramenta para reler a tabela de partições.

Monitoramento e Configuração de CPU

O primeiro passo para monitorar e configurar a CPU é consultar o arquivo /proc/cpuinfo, que

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 545


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

contém as informações sobre a CPU que o Kernel identificou.

Neste arquivo pode-se encontrar informações importantes, tais como:

Número de CPUs;
Família do processador;
Modelo do processador;
Velocidade da Cpu em Hz;
Cachê interno;
Flags (recursos que a CPU suporta).

Exemplo:

$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 94
model name : Intel(R) Core(TM) i7-6820HQ CPU @ 2.70GHz
stepping : 3
microcode : 0xd4
cpu MHz : 2712.000
cache size : 8192 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 2
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 22
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic
sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht
syscall nx rdtscp lm constant_tsc nopl xtopology nonstop_tsc
cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic
movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand
hypervisor lahf_lm abm 3dnowprefetch invpcid_single pti fsgsbase
tsc_adjust bmi1 hle avx2 smep bmi2 invpcid mpx rdseed adx smap
clflushopt xsaveopt xsavec xsaves dtherm arat pln pts
bugs : cpu_meltdown spectre_v1 spectre_v2
spec_store_bypass l1tf
bogomips : 5424.00
546 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
power management:

O primeiro comando para verificar o uso da CPU é o uptime.

uptime
$ uptime [opções]

O comando uptime mostra quanto tempo o sistema está no ar, a quantidade de usuário
logados e a carga da CPU.

As opções mais comuns são:

-p Mostra desde quando o sistema está ligado de uma forma "bonitinha"


-s Mostra desde quando o sistema está ligado no formato ANO-MES-DIA
HORA:MINUTO:SEGUNDO

As médias de carga de CPU mostradas pelo comando uptime são calculadas com uma média
dos processos em execução ou esperando pela CPU. Essas médias não são normalizadas pelo
número de CPUs.

É muito importante memorizar que o uptime mostra a média de carga de CPU no último 1
minuto, nos últimos 5 minutos e nos últimos 15 minutos, nesta ordem.

Se a carga de CPU for maior que 1, e se o sistema tem apenas uma CPU, significa que o uso
da CPU está além da capacidade, portanto, há uma espera grande por CPU pelos processos.

Mas para tirar conclusões mais acertadas, vai depender do tempo em que a média de CPU
está acima de 1. Se houve um pico de uso de CPU no último minuto, mas as médias de carga
nos tempos de 5 e 15 minutos são baixas, não é um indicativo que há necessidade de troca
da CPU. Mas se as médias são altas com 5 e 15 minutos também, significa que a capacidade
de processamento pode estar mal planejada em relação à carga do sistema.

Também é importante saber que essas médias não são normalizadas pelo número de
processadores. Um número de carga de 1 em um sistema com 4 processadores, significa que
as CPUs estão ociosas 75% do tempo. Desta forma, pode-se entender que para sobrecarregar
um sistema com 4 CPUs, a carga média precisa ser maior que 4.

Veja neste exemplo que há CPU de sobra:

$ uptime
20:35:37 up 31 days, 9:41, 1 user, load average: 0,02, 0,02,
0,00

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 547


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

A opção -p mostra desde quando o sistema está ligado no estilo contagem de dias:

$ uptime -p
up 4 weeks, 3 days, 9 hours, 45 minutes

E a opção -s mostra desde quanto tempo o sistema está ligado no formato de data:

$ uptime -s
2019-08-15 10:53:45

A quantidade de CPUs de um sistema pode ser visualizada no arquivo /proc/cpuinfo, com


parâmetro "model name":

$ grep -c 'model name' /proc/cpuinfo


1

sysstat
$ sysstat

O pacote sysstat pode fornecer estatísticas consistentes sobre o desempenho do Linux,


incluindo o uso da CPU, memória, operações de disco (E/S).

O pacote precisa ser instalado usando o gerenciador de pacotes YUM ou APT, dependendo da
distribuição:

Para Ubuntu/Debian:

# apt install sysstat

Para Redhat/CentOS/Fedora:

# yum install sysstat

A ferramenta especial do sysstat é o sar. Ele coleta informações e emite relatórios.

Ele fica executando como um serviço, coletando informações sobre o sistema.

O sar mantém os logs com as informações de desempenho no diretório /var/log/sa/.

Para habilitar o sar, é necessário fazer dois passos:

548 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Primeiro é preciso alterar o arquivo /etc/default/sysstat e trocar a linha para


ENABLE="true":

ENABLED="true"

Depois, pode-se ativar o serviço com o systemctl:

# systemctl start sysstat

E habilitá-lo na carga do sistema:

# systemctl enable sysstat

Feito isso, pode-se ver os relatórios que o sar produz.

A opção "-u" mostra as estatísticas da CPU, a cada 2 segundos por 3 vezes:

$ sar -u 2 3
Linux 4.15.0-34-generic (parallels-Parallels-Virtual-Platform)
10:06:05 PM CPU %user %nice %system %iowait %steal %idle
10:06:07 PM all 0.75 0.00 0.50 0.00 0.00 98.74
10:06:09 PM all 1.00 0.00 0.25 0.00 0.00 98.75
10:06:11 PM all 1.00 0.00 0.50 0.00 0.00 98.50
Average: all 1.05 0.00 0.55 0.05 0.00 98.35

Em ambientes de máquinas virtuais, a coluna "steal" mostra a quantidade de CPU roubada


por outras VMs.

O sar também monitora a memória com a opção "-r":

$ sar -r
Linux 4.15.0-34-generic
09:55:01 PM kbmemfree kbavail kbmemused %memused
10:05:01 PM 234288 373516 769108 76.65
10:15:01 PM 234228 373804 769168 76.66
Average: 234258 373660 769138 76.65

Monitoramento e Configuração de
Memória

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 549


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

O principal arquivo disponível no Kernel do Linux para consultar dezenas de informações


sobre o uso da memória no sistema é o /proc/meminfo:

$ cat /proc/meminfo
MemTotal: 1003396 kB
MemFree: 71240 kB
MemAvailable: 159292 kB
Buffers: 14144 kB
Cached: 192328 kB
SwapCached: 19964 kB
( ... )

O comando free fornece essas informações de forma sintética:

free
$ free [opções]

O comando free mostra a quantidade de memória total, em uso e disponível.

As opções “-b”, “-k” e “-m” mostram a quantidade em bytes, kbytes e megabytes


respectivamente:

$ free
total used free shared buff/cache available
Mem: 2039524 189396 178424 131684 1671704 1503316
Swap: 0 0 0

A opção -h mostra as quantidades de maneira mais fácil de ler:

$ free -h
total used free shared buff/cache available
Mem: 1,9G 153M 205M 128M 1,6G 1,5G
Swap: 0B 0B 0B

Abaixo o significado de cada campo:

total: Total de memória RAM instalada no sistema;


used: Memória utilizada (total - free - buffers - cache);
free: Memória disponível;
shared: Memória compartilhada entre os processos usando o tmpfs. Os processos

550 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

podem alocar memória que compartilham por exemplo com seus processos filhos;
buffers: Memória usada como área de transferência pelo kernel;
cache: Memória usada pelo cachê de páginas de memória;
available Memória disponível sem levar em conta a memória utilizada em buffers e
cache

Nas versões antigas do comando free, a informação de buffer e cachê eram separadas em
duas colunas, porque o Linux dividia o buffer cachê em duas categorias. O buffer era a
memória usada pelo Kernel, e o Cachê era a memória usada pelos processos para cachê.
Resolveu-se juntar essa informação em uma só coluna.

O comando free também mostra a quantidade de memória disponível e usada em swap.

O swap é uma área de disco que pode ser usada como espaço de troca de páginas de
memória entre a RAM e o disco, possibilitando aumentar virtualmente a memória do sistema
através das paginações entre memória e disco. É um recurso que pode ser usado para evitar
um esgotamento da memória RAM.

Se o sistema faz bastante uso do Swap, é um forte indicativo que há necessidade de se


aumentar a quantidade de memória RAM em função do uso do sistema.

Swap

É possível "expandir" a memória do sistema de forma virtual, utilizando parte do disco para
fazer a troca de pedaços de dados na memória, chamados de páginas, entre o disco e a
memória RAM. Essa troca permite que mais programas estejam em execução ao mesmo
tempo, de forma que os dados não necessários podem ser colocados no disco, e quando
solicitados, trocam de lugar com algo na memória.

O Linux permite que uma partição especial chamada de Swap atue como uma memória
virtual em disco permitindo que programas e dados sejam armazenados temporariamente
possibilitando que o sistema execute mais programas concorrentemente.

O espaço destinado a esta partição depende das aplicações que serão executadas no
sistema e o volume de dados que estas aplicações irão lidar. Via de regra é recomendado
que o Swap tenha pelo menos o mesmo tamanho da memória RAM e, em sistemas com
pouca memória, três vezes o seu tamanho.

Um sinal que o Linux está com pouca memória em relação a sua utilização, é o uso intensivo
do Swap.

O comando free mostra a quantidade de memória RAM disponível e utilizada, bem como o
Swap disponível e utilizado:

Se o espaço em disco disponível para a instalação do Linux for pequeno, digamos em torno
de 8GB, é aconselhável com que você mantenha o sistema raiz em uma única partição para
evitar desperdícios.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 551


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

$ free -m
total used free shared buff/cache available
Mem: 1991 117 398 128 1476 1525
Swap: 0 0 0

Para se usar o Swap, é necessário primeiro preparar uma partição com o comando mkswap.

mkswap
# mkswap [opções] dispositivo [tamanho]

O comando mkswap prepara o dispositivo para ser usado como área de memória virtual
(swap).

O argumento dispositivo geralmente será uma partição de disco (algo como /dev/sdb7),
mas também pode ser um arquivo.

Não é exatamente necessário que a partição seja do tipo Swap - Tipo 82 no fdisk - mas é bom
que a partição seja do tipo 82.

Depois de criar o disco de swap com o comando mkswap, é necessário ativar com o comando
"swapon" e colocar no /etc/fstab para que a partição seja usada como swap após o reinicio do
sistema.

Exemplo de uso:

# mkswap /dev/sdb1
mkswap: /dev/sdb1: warning: wiping old swap signature.
Setting up swapspace version 1, size = 2097148 KiB
no label, UUID=a873901e-5b33-4c78-84f5-e9eeadd9fba3

Depois de criada, a partição de swap pode ser ativada com o comando swapon:

# swapon
NAME TYPE SIZE USED PRIO
/dev/dm-1 partition 4G 256K -1

Uma vez ativada, a informação sobre o uso do Swap fica disponível no comando free:

$ free -h
total used free shared
buff/cache available
Mem: 1,9G 651M 76M 116M
552 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

1,2G 1,0G
Swap: 4,0G 22M 4,0G

Para desativar o swap, pode-se usar o comando swapoff:

# swapoff

vmstat
$ vmstat

vmstat
O comando vmstat fornece informações sobre processos, memória, paginação, E / S de bloco,
traps, discos e atividade da CPU, desde o último reboot.

Ele é útil para fornecer informações de E/S de disco específicas do uso do swap.

Se executado sem nenhum parâmetro, ele mostra as informações uma única vez. O vmstat
aceita também um intervalo em segundos para atualizar a informação:

$ vmstat
procs -----------memory---------- ---swap-- -----io----
r b swpd free buff cache si so bi bo
0 0 23296 118760 96204 1029300 0 0 6 22

Out-of-Memory-Killer

O Kernel Linux permite sobrecarregar a memória, uma vez que os processos são escalonados
no processamento. Isso permite eficiência e desempenho, mas até certo ponto.

Quando o uso da memória chega num estado crítico, o Kernel do Linux executa uma rotina
chamada "Out -of-Memory Killer".

Esta rotina verifica todos os processos usando a memória e emprega uma pontuação. A
pontuação é baseada na memória total que um processo consome, com os seus processos
filhos. Quanto maior o consumo de memória e mais processos filhos ou threads, maior a
pontuação.

Os processos do Kernel, do usuário root e sistemas cruciais recebem pontuações baixas


automaticamente.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 553


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

O objetivo é eliminar o menor número de processos para sair do estado crítico de memória.

Se um processo tiver uma pontuação alta, ele é eliminado. A rotina de Out-of-Memory-


Killer verifica e termina os processos de pontuação alta até que o sistema volte ao status
normal da memória.

Ajustes no Kernel com Sysctl

É possível fazer ajustes no Kernel alterando alguns parâmetros alterando o arquivo


/etc/sysctl.conf ou no diretório /etc/sysctl.d.

Estes parâmetros de ajuste do Kernel são carregados no momento do boot do sistema.

O comando sysctl também pode ser usado para alterar os parâmetros do Kernel na hora.

Alguns parâmetros são interessantes:

vm.panic_on_oom

Este parâmetro determina qual será a providência do Kernel se o sistema atingir níveis
críticos de memória. Se configurado para 1 o sistema entrará em "Kernel Panic". Se
configurado para 0, o sistema ativará a rotina de "Out-of-Memory-Killer".

Para ativar imediatamente a configuração, pode-se usar o comando sysctl:

$ sysctl vm.panic_on_oom=1

Para manter essa configuração permanente, pode-se alterar incluir no diretório /etc/sysctl.d:

$ echo "vm.panic_on_oom=1" >> /etc/sysctld/panic.conf

kernel.panic

O valor do do parâmentro para kernel.panic indica os segundos que deverão se passar antes
da reinicialização do sistema.

$ sysctl kernel.panic=10

Para colocar o valor de forma permanente:

echo "kernel.panic=10" >> /etc/sysctl.d/panic.conf

vm.swappiness

O valor de swappiness define o quanto de memória o Kernel vai usar em Swap. Um valor zero
554 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

define que o Kernel não usará o swap, e 100, define que o kernel irá usar muito o swap.

$ sysctl vm.swappiness=10

Para colocar o valor de forma permanente:

echo "vm.swappiness=10" >> /etc/sysctl.d/swap.conf

Perda de Senha de Root

Perder a senha do root pode ser um problema. No entanto, há duas maneiras de recuperar a
senha:

A primeira, é utilizar uma conta de usuário que faça parte do grupo de "sudoers", e possa
trocar a senha do root utilizando o comando sudo:

$ sudo su -
# passwd

Se não for possível entrar no sistema com alguma conta privilegiada, ainda assim é possível
reiniciar o computador, e entrar no modo de emergência para efetuar a troca de senha do
root.

O passo a passo é:

1. Reiniciar o computador;
2. Entrar no Menu do Grub;
3. Escolher a linha do Menu que será usada para o boot;
4. Apertar a tecla "E" para editar a linha;
5. Procurar no editor a linha que começa com "linux" ou "linux16";
6. No final desta linha, dar um espaço, e acrescentar o número 1;
7. Pressionar Ctrl-X para reiniciar o sistema;
8. Use o comando passwd para alterar a senha de root;
9. Reiniciar o sistema normalmente;

Em sistemas como CentOS e Fedora, especialmente aqueles que usam o SELinux, é um


pouco diferente:

1. Reiniciar o computador;
2. Entrar no Menu do Grub;
3. Escolher a linha do Menu que será usada para o boot;
4. Apertar a tecla "E" para editar a linha;
5. Procurar no editor a linha que começa com "linux" ou "linux16";
6. Procurar nesta linha por "ro" (readonly). Apague o "ro" e escreva no lugar: "rw

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 555


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

init=/sysroot/bin/sh"
7. Pressionar Ctrl-X para reiniciar o sistema;
8. Digite "chroot /sysroot";
9. Use o comando passwd para alterar a senha de root;
10. Se o sistema usar o SELinux, force-o a reetiquetar a partição raiz com o comando
"touch /.autorelabel"
11. Digite "exit";
12. Reinicie o sistema normalmente com o comando "reboot";

556 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Simulado
4.2 Analise de Processos do Sistema
para Otimizar o Desempenho

É bem verdade que o Kernel do Linux tem uma capacidade excelente para trabalhar com
processos sem intervenção do usuário. Mas às vezes é preciso que o root intervenha e
termine um processo que esteja comportando de forma egoísta e exaurindo os recursos da
máquina.

Este controle de processos é especialmente importante porque o Linux é um sistema


multitarefa, multiusuário e multiprocessado.

O conceito de multitarefa significa que o Linux é capaz de executar diversos programas e


serviços ao mesmo tempo, de forma preemptiva.

O conceito de preemptivo é se tivermos apenas um processador central no computador, o


sistema fará o escalonamento (rodízio) dos processos de forma tão eficiente que o usuário
terá a impressão de que ele pode executar mais de um programa ao mesmo tempo.

E o Linux ainda possui a capacidade de gerenciar os processos de forma eficaz com o


multiprocessamento, quando temos mais de um processador central envolvido.

O que é um processo?
Quando um programa está em execução, ele é chamado de processo.

Um processo no Linux possui alguns atributos, tais como:

Process ID (PID): ou identificação do processo: Cada processo possui um número de


identificação único. O primeiro processo init sempre terá o PID 1 e para o restante dos
processos este número é incrementado à medida que novos processos são executados.
Em sistemas que usam o Systemd, o processo systemd assume o PID 1.

User ID e Group ID: (ID do usuário e ID do grupo): Os processos precisam ser


executados com os privilégios de uma conta de usuário e do grupo associado a eles. Isto
é importante porque assim o sistema pode determinar e gerenciar o acesso aos
recursos;

Processo Pai: No Linux nenhum processo é executado de forma independente dos


outros. Todos os processos no sistema, com exceção do init, possuem um processo pai,
que é responsável pela sua execução. O atributo ParentID grava o PID do processo pai.
Caso o processo pai termine sua execução antes do processo filho, o processo filho é
“apadrinhado” pelo init, ganhando o Parent ID igual a 1;

Variáveis de Ambiente: Cada processo herda do processo pai algumas variáveis de


ambiente que simplesmente guardam alguns valores que podem ou não ser importantes
para o processo em execução. É possível que durante sua execução um processo altere,
incremente ou apague uma variável de ambiente. Um processo filho pode herdar as

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 557


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

variáveis de um processo pai. Mas um processo pai não consegue acessar as variáveis
criadas ou alteradas por seus filhos.

Diretório de Trabalho: Os processos também são associados a um diretório de


trabalho, onde podem fazer a leitura e a escrita do disco;

Temporizadores: O Kernel mantém registros da hora em que os processos são criados


bem como o tempo de CPU que eles consomem durante a sua execução.

Terminal: Um processo pode ou não estar ligado à um terminal TTY.

Num ambiente multi programado, com apenas um processador, cada processo é executado
aos poucos de cada vez, de forma intercalada. O sistema operacional aloca a CPU um pouco
para cada processo. Um processo após receber o controle do processador só o perderá
quando ocorrer uma interrupção ou quando requerer algum serviço do sistema operacional.

Estas interrupções são transparentes aos processos, pois apenas interrompem


temporariamente a sua execução, que depois continuará a ser executada como se nada
tivesse acontecido. Ao requerer um serviço do sistema operacional, o processo é bloqueado
até que o serviço requerido ao sistema operacional seja satisfeito.

O Linux utiliza um algoritmo para fatiar o tempo de CPU entre os processos baseado em
prioridades. A ideia é classificar os processos com base no valor e na necessidade de tempo
do processador. Os processos com prioridade mais alta serão executados antes daqueles
com prioridade mais baixa, enquanto os processos com a mesma prioridade são agendados
como round-robin (um após o outro, repetindo).

Em alguns sistemas, incluindo o Linux, os processos com maior prioridade também recebem
um tempo maior de CPU. O usuário root e o sistema podem definir uma prioridade de
processos para influenciar o comportamento do agendamento do sistema.

O principal comando para verificar os processos é o ps.

ps
$ ps [opções]

O comando ps gera uma lista com todos os processos em execução e os seus atributos.

Houve um momento no Linux que coexistiram duas versões do comando ps em diferentes


distribuições. Há pouco tempo os desenvolvedores resolveram juntar as duas versões do
ps numa única versão, mas deixaram as opções de ambas as versões diferentes coexistindo.

Desta forma, ao informar um parâmetro no ps, os resultados vão ser diferentes:

Sem usar o sinal de menos, o ps se comporta mostrando os processos no estilo BSD;


Com um sinal de menos apenas "-" o ps se comporta mostrando os processos no
estilo do Unix, usando o padrão POSIX;

558 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Com dois sinais de menos "--" o ps se comporta mostrando os processos no estilo


GNU.

Não existe certo ou errado, apensa preferência histórica.

As opções mais frequentes do ps são:

a Mostra os processos em execução ligados a um terminal, de todos os usuários;


-a Mostra os processos em execução ligados a um terminal, menos os processos de
sessão;
-e, -A Mostra todos os processos;
-u Mostra a lista de processos incluindo o nome dos usuários donos dos processos e
início das execuções, percentual de CPU utilizada, percentual de memória utilizada e
terminal associado;
-x Mostra a lista de processos, incluindo aqueles que não têm um terminal associado
a ele. Útil para visualizar processos servidores (daemons);
-f Mostra os processos em forma de árvore. Muito útil para identificarmos a relação
de processo pai e filho entre os processos em execução;
-H Mostra hierarquia dos processos em forma de árvore;

Veja o help do comando ps para mais opções.

Neste exemplo o ps somente mostra os processos do usuário logado e ligados ao terminal:

$ ps
PID TTY TIME CMD
1415 pts/0 00:00:00 ps
30019 pts/0 00:00:00 bash

Para mostrar todos os processos de todos os usuários ligados a um terminal:

$ ps a
PID TTY STAT TIME COMMAND
1628 pts/0 R+ 0:00 ps a
3297 tty1 Ss+ 0:00 /sbin/agetty --noclear tty1 linux
27159 pts/0 T 0:00 sudo find / -iname backup.sh
27160 pts/0 T 0:00 find / -iname backup.sh
30019 pts/0 Ss 0:00 -bash

Repare como a opção "-a" é diferente do "a":

$ ps -a
PID TTY TIME CMD
1675 pts/0 00:00:00 ps

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 559


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

27159 pts/0 00:00:00 sudo


27160 pts/0 00:00:00 find

A opção "u" adiciona alguns atributos dos processos:

$ ps au
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME
COMMAND
root 3297 0.0 0.0 121336 1600 tty1 Ss+ ago15 0:00
/sbin/agetty --noclear tty1 linux
root 3298 0.0 0.1 120984 2064 ttyS0 Ss+ ago15 0:00
/sbin/agetty --keep-baud 115200,38400,9600
ec2-user 3414 0.0 0.1 164440 4032 pts/0 R+ 18:38 0:00
ps au
root 27159 0.0 0.3 216984 6608 pts/0 T 17:46 0:00
sudo find / -iname backup.sh
root 27160 0.0 0.1 128308 3944 pts/0 T 17:46 0:00
find / -iname backup.sh
ec2-user 30019 0.0 0.2 127120 4348 pts/0 Ss 14:48 0:00
-bash

Para obter uma lista completa dos processos em execução, não só aqueles que estão
conectados ao terminal, adicione a opção "x":

$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME
COMMAND
root 1 0.0 0.2 199452 4968 ? Ss ago15 9:23
/usr/lib/systemd/systemd --switched-root --
root 2 0.0 0.0 0 0 ? S ago15 0:00
[kthreadd]
( ... )
ec2-user 30018 0.0 0.2 152864 4384 ? S 14:48 0:00
sshd: ec2-user@pts/0
ec2-user 30019 0.0 0.2 127120 4348 pts/0 Ss 14:48 0:00
-bash
postfix 30391 0.0 0.3 90536 6928 ? S 18:06 0:00
pickup -l -t unix -u

Os processos cujo comando estão envoltos em chaves, como no destaque do [ktheradd],


indicam que eles foram retirados da memória RAM, e colocados na memória virtual em disco.
Quando os processos estão na memória virtual em disco, são chamados de sleeping.

560 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

O Kernel coloca com frequência os processos para dormir, enquanto eles estão à espera de
algum evento, que pode ser, por exemplo, carregar dados do disco, ou uma conexão de rede.

Quando o evento é acionado, o Kernel envia um sinal ao processo.

Se o processo estiver em modo de suspensão interruptível, ele receberá o sinal do Kernel


e imediatamente acordará.

Se o processo estiver em modo de suspensão ininterrupto, ele só será ativado com base
num evento externo, como, por exemplo, o retorno de um hardware. No modo de suspensão
initerrupto, os sinais que porventura o processo receber serão salvos, e processados somente
quando o processo acordar.

As opções "efH" mostram todos os processos, com a hierarquia deles em forma de árvore:

$ ps -efH
UID PID PPID C STIME TTY TIME CMD
root 3252 1 0 ago15 ? 00:00:00 /usr/sbin/sshd
-D
root 29998 3252 0 14:48 ? 00:00:00 sshd: ec2-
user [priv]
ec2-user 30018 29998 0 14:48 ? 00:00:00 sshd: ec2-
user@pts/0
ec2-user 30019 30018 0 14:48 pts/0 00:00:00 -bash
ec2-user 4176 30019 0 18:43 pts/0 00:00:00 ps -efH

É possível brincar com os comandos, como, por exemplo, saber quais são os processos que
mais consomem a CPU:

$ ps aux | sort -nrk 3,3 | head -n 5


USER PID %CPU %MEM VSZ RSS TTY STAT START TIME
COMMAND
nginx 3342 0.2 1.6 426976 34048 ? Sl ago15 133:04
amplify-agent
rpc 2729 0.0 0.1 73828 3276 ? Ss ago15 0:02
/sbin/rpcbind -w
root 9421 0.0 0.0 0 0 ? I set13 0:01
[kworker/u30:1]
root 9 0.0 0.0 0 0 ? I ago15 0:00
[rcu_bh]

Independente de como se queira ver os processos em execução, alguns atributos são


importantes para um administrador Linux, tais como:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 561


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Usuário dono do processo (UID)


É impossível executar um programa no Linux sem que ele tenha um usuário dono. Isto
significa que o programa vai ter as permissões de acesso ao disco e recursos do usuário que
executou o programa. Essa noção é importante, pois é possível executar um programa como
outro usuário que não seja o usuário logado.

Número de Processo - Process ID (PID)


Todo programa em execução recebe um ID numérico único. Esse número pode ser usado
para enviar sinais para o programa em execução.

Processo Pai (PPID)


Todo programa exceto o init ou systemd, tem processo pai, que originou a sua execução. É
comum um programa servidor, por exemplo, ter um processo pai (master) e vários processos
ou threads (filhos).

Threads podem ser entendidas como pedaços do programa que executam como se fossem
processos filhos, porém mais leves, pois compartilham muita coisa com o processo pai. Esta
tecnologia é muito usada nos processadores com vários núcleos (cores) para permitir
execução de várias threads ao mesmo tempo.

% de CPU
Cada processo ganha uma fatia do tempo da CPU, que pode ser contabilizada, e serve como
parâmetro para o administrador saber quais são os processos que consomem muita CPU.

% de Memória
Cada processo em execução também ganha uma fatia da memória RAM, que também pode
ser contabilizada para que o administrador saiba os processos que consomem muita RAM

Hora de início (STIME)


Cada processo também tem como atributo a hora em que foi executado.

Tempo de CPU (TIME)


Cada processo também tem como atributo o tempo de CPU acumulado na sua execução.

Linha de comando (CMD)


Os processos também mantém um atributo que é a linha de comando que foi usada na
execução

Terminal (TTY)
Cada processo pode ou não ter um Terminal associado.

562 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

A título de curiosidade, o que o comando ps realidade faz é varrer algumas informações do


diretório /proc. Tome como exemplo o processo sshd:

$ ps aux | grep ssh


root 3252 0.0 0.3 112928 7848 ? Ss ago15 0:00
/usr/sbin/sshd -D

Se olharmos o diretório /proc, ele terá um subdiretório com o número 3252, que
corresponde ao PID do programa sshd:

# cd /proc/3252
# ls
attr coredump_filter gid_map mem oom_adj
root stack timerslack_ns
autogroup cpuset io mountinfo oom_score
sched stat uid_map
auxv cwd latency mounts
oom_score_adj schedstat statm wchan
cgroup environ limits mountstats pagemap
sessionid status
clear_refs exe loginuid net patch_state
setgroups syscall
cmdline fd map_files ns personality
smaps task
comm fdinfo maps numa_maps projid_map
smaps_rollup timers

Por exemplo, a linha de comando do programa com o PID 3252 pode ser consultada com um
simples cat:

# cat cmdline
/usr/sbin/sshd-D

Várias informações sobre um processo podem ser visualizadas no diretório /proc/[número


do PID]. O utilitário ps apenas organiza a informação para uma leitura mais humana.

pgrep
$ pgrep [expressão]

O comando pgrep permite que se procure por expressões na lista de processos em execução

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 563


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

e retorna o PID do processo em questão. Ele também permite que sinais sejam enviados para
esses processos elencados na expressão de busca.

Neste exemplo o pgrep lista todos os PIDs dos processos do nginx:

$ pgrep nginx
27991
27993
27994

Para listar todos os PIDs dos processos cujo dono é o root:

$ pgrep –u root
1
2
3

Para enviar um sinal para os processos, basta usar a opção --signal e o número do sinal.
Neste exemplo é enviado o sinal SIGHUP ao nginx:

# pgrep --signal 1 nginx


27991
27993
27994

top
$ top [opções]

Outra forma interessante de ver os processos em execução é com o comando top.

O comando top mostra os processos em execução como o comando ps, mas atualizando a
tela. Este recurso é útil para monitorarmos como um ou mais processos agem no sistema.
Este comando também ordena os processos que utilizam mais CPU no TOPo da tela.

As opções mais utilizadas são:

-b: Executar em modo batch ou arquivo em lote. É utilizada para direcionarmos a


saída do comando para outro processo ou para um arquivo;
-d n: Determina o tempo das atualizações da tela em n segundos. O padrão é cinco
segundos;
-n num: Mostra o número de vezes na tela as atualizações dos processos em

564 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

execução e depois termina. Útil para ser utilizado com a opção –b;
-q: Executar com atualizações em tempo real. Esta opção deve ser utilizada com
cautela, pois pode consumir uma grande quantidade de cpu;
-u: Monitora os processos em execução de um determinado usuário;
-p: Monitora um determinado processo identificado pelo seu PID. Mais de um processo
pode ser definido com esta opção.

O comando top ainda pode suportar alguns comandos que alteram o seu comportamento
durante a sua execução. São eles:

Z: Muda o esquema de cores do top. Para que esta opção esteja ativa é necessário
que o terminal suporte ANSI;
F: Adiciona colunas com mais opções de monitoramento dos processos;
u: Mostra os processos de um determinado usuário;
k: Termina (kill) com um determinado processo;
r: Muda a prioridade de execução do processo (renice);
R: Muda a ordem dos processos de acordo com a utilização da CPU;
q: Sai do modo interativo do top.

Figura 54 - Top

O comando top na primeira linha fornece a média de carga da CPU (load average),

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 565


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

correspondente a 1 minuto, 5 minutos e a 15 minutos, igual ao comando "uptime". Quanto


maiores os números, mais sobrecarregado o sistema estará.

É comum o sistema experimentar taxas altas na média de 1 minuto. Mas uma taxa média
alta constante no indicador de 15 minutos é um sinal de que a CPU está mal dimensionada.

Na segunda linha tem o total de processos, quantidade em estado de execução (running -


que corresponde ao número de CPUs e núcleos), sleeping (que estão em disco), parados
(stop) e processos zombie (processos filhos que pararam de executar, mas o processo pai
não foi alertado).

Na terceira linha o top mostra a quantidade total de memória, memória livre, usada e em
buffer/cache.

Na quarta linha mostra o uso do Swap.

pkill
$ pkill [-sinal ] PID

O comando pkill envia sinais para os processos. Ele trabalha da mesma forma que o pgrep.

O sinal pode ser informado numericamente ou pelo seu nome:

# pkill -1 nginx

Ou

# pkill -HUP nginx

time
$ time comando

O comando time é útil quando se deseja saber em quanto tempo um programa levou para
ser executado.

Seu uso é simples, bastando informar como parâmetro o comando a ser executado. Ao
término da execução do programa, ele mostra o tempo real, tempo de usuário e de sistema.

$ time find / -name uira* 2>/dev/null


/home/linux/author/uiraribeiro
566 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

real 0m1.017s
user 0m0.519s
sys 0m0.419s

O tempo de usuário (user) é execução do programa em modo usuário, que, significa que o
programa executou algo que não envolvia hardware.

O tempo de sistema é a execução do programa em modo kernel, que significa que o


programa fez uso de chamadas de sistema, que de algum modo fez acesso ao hardware.

lsof
$ lsof [opções]

O comando lsof mostra todos os arquivos abertos por todos os processos em execução. É um
comando que devolve uma extensa lista com todos os recursos utilizados por um processo,
incluindo as portas TCP/UDP se for o caso.

# lsof | grep ssh


sshd 3429 root cwd DIR 202,1 237 96 /
sshd 3429 root rtd DIR 202,1 237 96 /
sshd 3429 root txt REG 202,1 832248 27174 /usr/sbin/sshd
( ... )

Situações Especiais de Erro nos


Processos

Processos Zombie
É possível, dentro de uma hierarquia de processos, que um determinado processo filho
termine por algum motivo inesperado, e o processo pai se torne um processo zoombie ou
defunto (defunct). Os processos zoombie não podem ser terminados com o comando kill,
porque eles já não existem mais. Como um zombie, já estão mortos.

Isso acontece porque cada processo criado recebe um lugar na tabela de processos do
Kernel. Quando ele termina, seu lugar na tabela do Kernel recebe o resultado da sua
execução. O resultado da execução é retido na tabela até alguém consultá-lo quando, então,
é removido da tabela.

O estado do processo é chamado de “zumbi” quando o mesmo termina e seu resultado ainda
não foi retirado da tabela do Kernel.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 567


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Os processos zumbis não usam CPU e apenas uma quantidade ínfima de memória para
armazenar o descritor do processo. No entanto, cada processo zumbi mantém seu ID do
processo (PID).

Os sistemas Linux possuem um número finito de IDs de processo - 32767 por padrão em
sistemas de 32 bits.

Se os zumbis estiverem acumulando em uma taxa muito rápida - por exemplo, se um


software de servidor com problemas estiver criando processos zumbis muito rápido, o
conjunto de PIDs disponíveis acabará sendo atribuído aos processos zumbis, impedindo a
execução de outros processos.

A única maneira de limpar a tabela de processos do kernel para acabar com os Zombies é
enviar o sinal SIGCHLD para o processo pai. Esse sinal informa ao processo pai para executar
a chamada do sistema wait () e limpar seus filhos zumbis. O sinal pode ser enviado com o
comando kill, substituindo pid no comando abaixo pelo PID do processo pai:

$ kill -s SIGCHLD pid

Processos Órfãos
Outra possibilidade especial é quando um processo pai que criou novos processos filhos
termine inesperadamente de forma abrupta.

Neste caso, os processos filhos perdem o seu processo pai e são adotados pelo processo
systemd (PID 1) que é o pai de todos os processos.

Observe a hierarquia entre os processos com o comando pstree –c –p:

$ pstree -c -p
systemd(1)─┬─acpid(3338)
├─agetty(3297)
├─agetty(3298)
├─atd(3274)
├─nginx(27991)─┬─nginx(27993)
│ └─nginx(27994)
└─systemd-udevd(2286)

Estas duas situações descritas não são normais e podem ser ocasionadas por bugs nos
programas.

Modificar a Prioridade dos Processos

É possível alterar a prioridade de execução dos processos, através dos comandos nice e
renice. Estes comandos são extremamente úteis em ambientes multiusuário, onde é preciso
568 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

dar mais ou menos fatias de CPU aos diversos programas dos usuários, para manter um
ambiente estável e organizado.

nice
$ nice [-n ajuste_de_prioridade] [comando]

O comando nice ajusta o tempo disponível de CPU de um processo para mais ou para menos
prioridade.

No inglês a palavra “nice” quer dizer “legal”. Se o ajuste de prioridade para um processo for
um número positivo, quer dizer que ele está sendo mais legal com os outros programas
diminuindo a sua prioridade.

Se o ajuste for um número negativo, quer dizer que o programa está sendo menos legal,
aumentando a sua prioridade de execução e sobrando menos tempo de CPU para os outros
programas.

O ajuste de prioridade possível vai do –20 (mais prioridade / menos legal) até o 19 (mais
legal, menos prioridade).

Se não for passado nenhum valor de ajuste, o comando nice ajustará a prioridade para +10,
diminuindo o tempo de execução do processo.

Por padrão todos os programas iniciam com prioridade zero. Apenas o administrador root
pode definir prioridades negativas (aumento de fatia de CPU).

Neste exemplo o comando updatedb tem menos prioridade de execução:

$ nice updatedb &

Neste exemplo o comando folha_pagamento será executado com mais prioridade.

$ nice –n –10 folha_pagamento

Para verificar a prioridade dos processos em execução, o comando ps pode ser usado. A
coluna NI mostra a prioridade:

$ ps -eo pid,ni,comm
PID NI COMMAND
1 0 systemd
2 0 kthreadd
4 -20 kworker/0:0H
6 -20 mm_percpu_wq
( ... )

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 569


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

30018 0 sshd
30019 0 bash

Alguns processos do sistema tem naturalmente prioridade máxima (-20).

O comando top também pode ser usado para ver a prioridade dos procesoss, na coluna NI:

Figura 54 - Top com coluna NI em destaque

renice
$ renice [+/-] ajuste_prioridade [opções] PID/Usuário

O comando renice ajusta a prioridade de execução de processos em execução.

Por padrão, o comando renice recebe como parâmetro o PID de um determinado processo. O
ajuste de prioridade é um número inteiro do –20 (maior prioridade) até o +19 (executar
qualquer coisa antes deste processo).

As opções mais usuais são:

-p: Recebe um PID para alterar sua prioridade.


-u: Recebe um nome de usuário para alterar a prioridade de todos os processos deste
usuário em execução.
-g: Recebe um nome de um grupo para alterar a prioridade de todos os processos
pertencentes a este grupo.

Neste exemplo, o processo de número PID 987, PID 32 e todos os processos de que os
usuários daemon e root são donos vão ter mais prioridade.

# renice -1 987 -u daemon root -p 32

570 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Os usuários comuns somente podem alterar a prioridade dos processos de que eles são
donos, e somente para diminuir a prioridade (do -20 até +19). Uma vez que o usuário comum
diminui a prioridade, ele não pode normalmente voltar para a prioridade anterior.

Somente o usuário root pode alterar a prioridade de qualquer processo, aumentando ou


diminuindo a prioridade.

Neste exemplo o programa com o PID 30018 passou de prioridade 0 para +2:

$ renice +2 30018
30018 (process ID) com prioridade antiga 0, prioridade nova 2

Se um usuário comum tenta aumentar a prioridade, ele não consegue:

$ renice +1 30018
renice: falha ao definir prioridade pra 30018 (process ID):
Permission denied

Somente o root consegue aumentar a prioridade. Neste exemplo o comando sudo executa o
renice como root:

$ sudo renice 0 30018


30018 (process ID) com prioridade antiga 2, prioridade nova 0

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 571


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Simulado
4.3 Analise e Solução de Problemas
dos Usuárioss

Permissões de Arquivo
Um dos primeiros problemas que os usuários enfrentam, principalmente os novatos, é a
permissão e propriedade dos diretórios e arquivos. Como o Linux lida com tudo como se
fosse um arquivo, isto interfere diretamente no resultado dos programas e comandos.

Quando ocorre um problema de permissões de arquivos, deve-se primeiro checar qual é o


Login do usuário logado, e também a propriedade dos arquivos.

Os comandos whoami ou id fornecem qual é o usuário logado:

$ whoami
uiraribeiro

Ou

$ id
uid=1000(uiraribeiro) gid=1000(diretoria)
groups=1000(diretoria),4(adm),24(cdrom),27(sudo),30(dip),46(plugd
ev),116(lpadmin),126(sambashare)

Agora que já se sabe qual é o usuário, pode-se determinar quais serão os direitos de acesso
ao arquivo, uma vez que as permissões são classificadas em três grupos, do dono do arquivo,
de um grupo e dos outros.

$ ls -l arquivo
-rw-rw-r-- 1 uiraibeiro diretoria 0 Jan 8 21:10 arquivo

Desta forma, as três primeiras permissões da esquerda pra direita, com destaque amarelo,
dão direitos ao usuário uiraribeiro. As permissões em verde, dão direito ao grupo diretoria.

Logo, se algum usuário que não seja uiraribeiro, nem pertença ao grupo diretoria, não terão
permissão de gravação.

Se, por exemplo, o usuário arthur precisar alterar o arquivo, há, portanto, 3 maneiras de
conceder acesso para outro usuário ao arquivo (da melhor para a pior);

1. Pode-se adicionar o usuário ao grupo diretoria, com o comando "sudo usermod -a -


G diretoria arthur". É a melhor maneira, pois o usuário arthur ganhará o direito de
572 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

gravação, e mantém o uiraribeiro como dono do arquivo.


2. Pode-se alterar o dono do arquivo para arthur, com o comando "sudo chown arthur
arquivo". É uma solução ruim, pois o uiraribeiro não será mais o dono do arquivo,
mas como ainda faz parte do grupo diretoria, não perderá o direito de acesso.
3. Pode-se dar direito a gravação aos "outros" com o comando "sudo chmod 666
arquivo". É a pior solução, pois libera a gravação para todos os usuários.

Permissões de Diretório
As permissões de diretório, funcionam um pouco diferente:

Permissão Descrição

r (leitura) Permite ao usuário listar o conteúdo do diretório.

w (gravação) Permite ao usuário criar, mover, renomear, apagar e mudar atributos dos arquivos contidos no
diretório.

x (execução) Permite ao usuário mudar o diretório corrente para o diretório com o comando "cd".

Então se o diretório só tem a permissão de leitura, só se poderá listar o conteúdo do


diretório, mas não se pode entrar nele, nem alterar nada.

Por exemplo, o diretório teste só tem permissão de leitura para o usuário uiraribeiro:

$ ls -l
dr-------- 3 uiraibeiro uiraribeiro 4096 Jan 8 22:44 teste/

Com esta permissão só é possível listar o seu conteúdo:

$ ls teste/
arquivo arquivo2 sub

Mas não é possível entrar no diretório:

$ cd teste/
-bash: cd: teste/: Permission denied

Nem mesmo alterar qualquer arquivo que esteja dentro dele:

$ echo "texto" >> teste/arquivo


-bash: teste/arquivo: Permission denied

Nem visualizar o conteúdo de um arquivo:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 573


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

$ cat teste/arquivo
cat: teste/arquivo: Permission denied

Alterando a permissão para leitura e gravação com o comando chmod:

$ chmod 600 teste

Ainda assim, não é possível alterar nenhum arquivo no diretório:

$ echo "texto" >> teste/arquivo


-bash: teste/arquivo: Permission denied

Ou mesmo criar um novo arquivo:

$ touch teste/arquivo2
touch: cannot touch 'teste/arquivo2': Permission denied

Para resolver isso, é necessário dar também permissão de execução no diretório com o
comando chmod:

$ chmod 700 teste

Agora é possível criar, alterar, mover e apagar arquivos:

$ touch teste/arquivo2

Se alteramos a permissão para somente leitura e execução:

$ chmod 500 teste

É possível alterar os arquivos existentes, se o usuário tem o direito de gravação no arquivo:

$ echo "texto" >> teste/arquivo

Mas não é possível criar novos arquivos:

$ touch teste/arquivo3
touch: cannot touch 'teste/arquivo3': Permission denied

574 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Não é possível renomear:

$ mv teste/arquivo2 teste/arquivo_antigo
mv: cannot move 'teste/arquivo2' to 'teste/arquivo_antigo':
Permission denied

Não é possível mover de lugar:

$ mv teste/arquivo2 /tmp
mv: cannot move 'teste/arquivo2' to '/tmp/arquivo2': Permission
denied

A permissão de execução (x) permite alterar o conteúdo do arquivo, mas não criar, mover ou
apagar.

E a permissão de gravação (w) só tem efeito, se houver a permissão de execução (x).

Desta forma, as permissões de diretório costumam ser "rwx", para pelo menos o dono do
diretório, senão não é possível fazer muita coisa.

Criar Arquivos
Se ao tentar criar um arquivo o usuário recebe um erro, é preciso checar as seguintes
premissas:

1. O usuário tem permissão de gravação e execução no diretório onde se deseja


criar o arquivo? Para isso é preciso checar as permissões com o comando "ls" e
verificar se o usuário ou o grupo ao qual pertence tem permissão "wx". Para resolver,
pode-se alterar a permissão do diretório com o comando chmod, adicionar o usuário
ao grupo do diretório com o comando usermod, ou alterar a propriedade do diretório
para o usuário com o comando chown.
2. Existe no diretório algum Controle de Lista de Acesso (ACL) habilitada limitando
os direitos do usuário? Use o comando getfacl para determinar isso. Se necessário,
altere a ACL com o comando setfacl.
3. O disco está cheio? O comando "df" pode ser usado para determinar se a partição
está cheia. Neste caso, pode-se aumentar o volume no caso de LVM, mover arquivos
para outra partição com o comando mv, apagar logs antigos com comando rm,
compactar arquivos (gzip, bzip2, xz), etc.
4. Há inodes suficientes? O comando "df -i" pode ser usado para determinar se há
inodes suficientes. Se não houver inodes, só se pode apagar arquivos para liberar os
inodes, de preferência em diretórios com muitos arquivos pequenos, pois cada arquivo
gasta pelo menos um inode.
5. Está habilitado cotas no disco? É preciso verificar o arquivo /etc/fstab, ou o
comando "mount" para determinar se o recurso de "quota" está habilitado. Se for o
caso, pode-se aumentar as cotas do usuário com o comando edquota, ou desabilitar
as cotas com o comando quotaoff.
6. A máscara de criação de arquivos está muito alta? Verifique com o comando

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 575


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

umask. Uma máscara muito alta (777) permite criar o arquivo, mas sem as permissões
necessárias para gravação.
7. As políticas do SELinux ou AppArmor estão habilitadas? Verifique nos arquivos
/var/log/message ou /var/log/audit/audit.log se não há uma violação de regras.

Apagar Arquivos
Se ao tentar apagar ou renomear um arquivo o usuário recebe um erro, é preciso checar as
seguintes premissas:

1. O usuário tem permissão de gravação e execução no diretório onde se deseja


apagar o arquivo? Para isso é preciso checar as permissões com o comando "ls" e
verificar se o usuário ou o grupo ao qual pertence tem permissão "wx".
2. Existe no diretório algum Controle de Lista de Acesso (ACL) habilitada limitando
os direitos do usuário? Use o comando getfacl para determinar isso. Se necessário,
altere a ACL com o comando setfacl.
3. O arquivo tem atributo imutável? O comando lsattr mostra os atributos dos
arquivos. Se houver um "i", o arquivo está protegido e não pode ser apagado. Para
alterar é necessário que um usuário com super privilégios remova o atributo imutável
com o comando "chattr -i".

Problemas de Acesso, Autenticação e


Ambiente

Para resolver problemas de acesso de um usuário ao sistema, seja relativo ao acesso local
Desktop ou remoto, as causas podem ser questões na conta do usuário, no processo de
autenticação ou problemas na configuração do ambiente.

Para resolver a questão é preciso verificar várias questões:

Contas de Usuário
Para verificar a conta do usuário, é preciso verificar os arquivos /etc/passwd e /etc/shadow. O
comando getent pode ser útil para isto:

Primeiro deve-se verificar se o usuário está usando o login correto na base do passwd:

$ getent passwd arthur


arthur:x:1001:1001::/home/arthur:/bin/sh

Deve-se verificar se o usuário tem acesso ao Shell, que é o último item no passwd (em
destaque amarelo). Os falsos shells /usr/sbin/nologin e /bin/false vão impedir o usuário de
logar interativamente no sistema.

Deve-se verificar ainda se o usuário tem um diretório home configurado (em destaque
verde), e se ele está criado:

576 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

$ ls /home/arthur

A falta de acesso ao diretório home do usuário pode ocasionar problemas na configuração do


ambiente do usuário.

Deve-se ainda verificar se o usuário tem uma senha configurada com o comando getent na
base shadow:

# getent shadow arthur


arthur:!:18270:0:99999:7:::

Somente uma exclamação ! no arquivo shadow após o login indica que nenhuma senha foi
configurada para o usuário. Desta forma é preciso configurar uma senha inicial para ele com
o comando passwd:

# passwd arthur
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

Após configurar uma senha, o resultado do getent shadow será diferente:

# getent shadow arthur


arthur:$6$dVrxE5oX$8lLlRRoVjBo47cAxcUP.gvPmKJVV/4tAxqmSUk8arndv/O
vQAFuqHOBoMRxgWg0zoZ9bBYhDecN.hARhKGQbj0:18270:0:99999:7:::

Ainda assim, numa conta que possua uma senha, é necessário verificar se não está travada.
Uma exclamação logo após o login no shadow e antes da senha indica que a conta está
travada. Algumas distribuições usam duas exclamações.

arthur:!$6$dVrxE5oX$8lLlRR (...)

A condição do travamento da conta também pode ser verificada com o comando "passwd -
S":

# passwd -S arthur
arthur L 01/09/2020 0 99999 7 -1

O "L" indica que a conta está travada.

Para destravar a conta, pode-se usar o comando passwd -u:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 577


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

# passwd -u arthur

Se a conta está destravada, o comando "passwd -S" terá um "P" no lugar do "L":

# passwd -S arthur
arthur P 01/09/2020 0 99999 7 -1

Resolvida a questão com a senha, deve-se checar se a conta não está expirada com o
comando chage -l:

# chage -l arthur
Last password change : Jan 09,
2020
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

Se a conta estiver expirada, pode-se alterar a expiração com o comando chage.

Se estiver tudo certo com a conta do usuário, deve-se checar o log do sistema de
autenticação para verificar quando foi o último acesso, e se houve mesmo uma tentativa de
acesso que foi mal sucedida.

Há casos de tentativa de acesso remoto, em que a solicitação nem sequer chegou ao host,
devido a algum filtro na rede.

Verificar o Log de Acesso


Pode-se verificar o último acesso bem-sucedido de um determinado usuário com os
comandos last e lastlog.

Qualquer um destes comandos consulta o arquivo /var/log/wtmp. Este arquivo guarda em


forma binária os últimos logins bem sucedidos:

$ last
uira :0 :0 Thu Jan 9 09:36 still logged in
reboot Thu Jan 9 09:36 still running
uira pts/1 10.211.55.2 Wed Jan 8 23:51 - 00:45 (00:53)
uira pts/1 10.211.55.2 Wed Jan 8 21:07 - 23:51 (02:44)
uira pts/1 10.211.55.2 Wed Jan 8 21:06 - 21:07 (00:00)
uira pts/1 10.211.55.2 Wed Jan 8 21:06 - 21:06 (00:00)
uira :0 :0 Sun Jan 5 22:34 - 00:45 (3+02:10)
578 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

reboot Sun Jan 5 22:33 - 00:45 (3+02:11)

O ":0" indica que o acesso foi realizado em ambiente gráfico Desktop. Já o "pts" e um
endereço IP, indicam que o acesso foi remoto.

Pode-se informar o login de um usuário ou de um terminal TTY como parâmetro, filtrando os


resultados:

# last uira

É um importante dizer que o arquivo wtmp geralmente sobre rodízio, da forma que os
arquivos antigos ganham um numeral no nome, indicando que é um log antigo:

$ ls -l wtmp*
-rw-rw-r-- 1 root utmp 6528 Jan 9 09:36 wtmp
-rw-rw-r-- 1 root utmp 3456 Dec 31 18:12 wtmp.1

Desta forma, para se ter acesso aos LOGs mais antigos, pode-se usar a opção "-f" do
comando last:

# last -f /var/log/wtmp -f /var/log/wtmp.1

Verificar o Log de acesso mal-sucedido

Para se verificar os logins mal-sucedidos, pode-se usar o comando lastb. Este comando
consulta o arquivo /var/log/bmtp. Ele também é um arquivo binário, e que sofre rodízio.
Desta forma, assim como o comando last ele aceita que se indique os arquivos para leitura
com a opção "-f".

$ ls -l btmp*
-rw-rw---- 1 root utmp 1152 Jan 8 21:05 btmp
-rw-rw---- 1 root utmp 384 Dec 31 16:10 btmp.1

O comando lastb mostra todas as tentativas de login sem sucesso:

# lastb
uira ssh:notty 10.211.55.2 Wed Jan 8 21:05 - 21:05
(00:00)
uira ssh:notty 10.211.55.2 Wed Jan 8 21:05 - 21:05
(00:00)
uira ssh:notty 10.211.55.2 Wed Jan 8 21:05 - 21:05
(00:00)

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 579


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

btmp begins Wed Jan 8 21:05:42 2020

Verificar o Log do SELinux ou AppArmor


Se no host estiver habilitado o SELinux ou o AppArmor, é possível que haja um bloqueio de
uma conta de usuário, devido alguma violação de política.

O AppArmor grava os logs de violação de políticas no arquivo /var/log/audit/audit.log ou no


/var/log/messages, dependendo da configuração.

Pode-se investigar os logs instalando o pacote "auditd" com o comando apt:

# apt install auditd

O auditd contém a ferramenta ausearch que ajuda a encontrar ocorrências no sistema


auditd.

# ausearch -m USER_LOGIN -sv no

A opção "-m" define o tipo de mensagem. Usa-se o tipo USER_LOGIN para encontrar
ocorrências de Login. A opção "-sv no" filtra somente as mensagens de insucesso.

O SELinux também possui o comando sealert, que mostra as ocorrências de violação de


políticas:

# sealert -a /var/log/audit/audit.log

Terminal
Uma das causas de insucesso no Login pode estar relacionada a problemas no terminal de
acesso, ou ao serviço getty, responsável por abrir os terminais.

O comando "ls" pode ser usado para se verificar os descritores de arquivos dos terminais:

$ ls -l /dev/tty?
crw--w---- 1 root tty 4, 0 Jan 9 09:36 /dev/tty0
crw--w---- 1 gdm tty 4, 1 Jan 9 09:36 /dev/tty1
crw--w---- 1 parallels tty 4, 2 Jan 9 09:36 /dev/tty2
crw--w---- 1 root tty 4, 3 Jan 9 09:36 /dev/tty3

Os descritores de arquivos para os terminais devem ter o "c" no tipo de arquivo, indicando
que se trata de dispositivos de carateres. Qualquer coisa diferente disso, indica que o
descritor de arquivos dos terminais estão corrompidos, e podem ser reparados com o
comando mknod.
580 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

Outra possibilidade de falha de login no terminal é o serviço Getty não estar ativo. O
comando systemctl pode ser usado para se verificar esta condição:

# systemctl status getty.target


● getty.target - Login Prompts
Loaded: loaded (/lib/systemd/system/getty.target; static;
vendor preset: enabled)
Active: active since Thu 2020-01-09 09:36:09 -03; 1h 11min ago
Docs: man:systemd.special(7)
man:systemd-getty-generator(8)
http://0pointer.de/blog/projects/serial-console.html
Jan 09 09:36:09 ubuntu systemd[1]: Reached target Login Prompts.

Interface Gráfica
Se o usuário consegue fazer login no sistema utilizando um terminal em modo texto (TTY),
mas não consegue fazer o login na Interface gráfica, é importante checar se o serviço está
ativo. Isto pode ser feito com o comando systemctl:

O primeiro serviço é o graphical.target:


# systemctl status graphical.target
● graphical.target - Graphical Interface
Loaded: loaded (/lib/systemd/system/graphical.target; static;
vendor preset: enabled)
Active: active since Thu 2020-01-09 09:36:19 -03; 53min ago
Docs: man:systemd.special(7)
Jan 09 09:36:19 ubuntu systemd[1]: Reached target Graphical
Interface.

Acesso Remoto
Se o problema está no acesso remoto, há várias configurações que podem ser verificadas:

Tcpwrapper

O serviço de SSH pode fazer uso da biblioteca de tcpwrapper, e restringir as conexões


baseadas em endereços de rede. Desta forma, é preciso verificar os arquivos
/etc/hosts.allow e /etc/hosts.deny para saber se há restrições no serviço de sshd.

Netfilter

É possível também alguma restrição no serviço de SSH através do Netfilter. O comando


"iptables -L" pode ser útil para verificar se há alguma regra restringindo o acesso ao acesso
remoto.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 581


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

sshd_config

As diretivas AllowUsers e AllowGroups no arquivo /etc/ssh/sshd_config podem restringir


o acesso aos usuários. Se essas diretivas existirem, somente os usuários ou grupos de
usuários listados nela terão permissão de acesso remoto via ssh.

Da mesma forma, as diretivas DenyUsers e DenyGroups podem ser usadas para banir
certos usuários ou grupos de logar no sistema.

Verifique também se a autenticação do ssh é feita pela combinação usuário/senha,


procurando a diretiva PasswordAuthentication no arquivo /etc/ssh/sshd_config:

$ cat /etc/ssh/sshd_config | grep PasswordAu


PasswordAuthentication yes

Se esta diretiva estiver comentada, ou configurada para "yes", significa que o sistema utiliza
a combinação de usuário e senha para autenticação.

Se a diretiva PasswordAuthentication for igual a "no", significa que o sistema utiliza um


par de chaves de criptografia para autenticação. Desta forma, o usuário precisa ter a chave
privada e utilizar a opção "-i" do ssh para se conectar:

$ ssh -i chaveprivada login@endereço

E a chave pública precisa estar no diretório home do usuário, no arquivo


~/.ssh/authorized_keys.

~/.ssh

Outra possibilidade é alguma configuração específica do usuário para ssh no diretório home.
Verifique se há um arquivo em ~/.ssh/config. As configurações deste arquivo sobrepõe as
configurações gerais no /etc/sshd_config.

SSH no modo verbose

O ssh permite habilitar o modo "verbose", que mostra os detalhes da conexão, utilizando-se
a opção "-v", "-vv" ou "-vvv":

$ ssh -v login@endereco

A cada "v", o ssh aumenta o nível de detalhes.

Autenticação
Uma questão para se verificar é a autenticação dos usuários no sistema utilizando o PAM,
especificamente os arquivos de configuração em /etc/pam.d.

582 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Bloqueio com pam_tally2 e faillock

Verifique se nos arquivos de autenticação no diretório /etc/pam.d encontram-se as diretivas


pam_tally2 ou faillock. Se os módulos de bloqueio por tentativas erradas estiver ativado, é
possível que o usuário esteja bloqueado:

$ grep "tally\|faillock" *
common-auth:auth required pam_tally2.so deny=2 silent

Se o módulo pam_tally2 estiver ativado, deve-se verificar se o usuário está bloqueado com
o comando pam_tally2:

# pam_tally2
Login Failures Latest failure From
uira 3 12/28/19 15:59:55 10.211.55.2

O usuário pode ser desbloqueado com o comando pam_tally2 com a opção "-r -u":

# pam_tally2 -r -u uira

E o módulo faillock for utilizado no processo de autenticação do PAM, o comando faillock


pode ser usado para determinar se o usuário está bloqueado:

$ faillock
uira:
When Type Source Valid
2019-12-28 16:31:33 RHOST 10.211.55.2 V

Neste caso, o comando faillock com as opções "--user" e "--reset" podem ser usadas:

# faillock --user uira --reset

Logs de Autenticação

O Linux mantém os seguintes arquivos de Log de autenticação, que podem ser verificados
para encontrar problemas:

Debian/Ubuntu: /var/log/auth.log
Red Hat/CentOS/Fedora: /var/log/secure

Autenticação Externa
É possível que o host utilize alguma forma de autenticação externa como LDAP, Active

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 583


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Directory ou Keberos. Isto adiciona uma complexidade adicional ao processo de


autenticação, uma vez que envolve protocolos específicos e servidores externos.

584 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Simulado
4.4 Analizar e Solucionar Problemas
de Aplicativos e Hardware

Violações do Contexto do SELinux


O módulo de segurança do Kernel SELinux pode ocasionar problemas nas aplicações, através
de violações nas políticas, negando acesso aos recursos de que a aplicação necessita.

Durante o funcionamento da aplicação, sugestiona-se habilitar o SELinux no modo


permissive, antes de passar para o modo enforcing. Isto permite que o log de violações de
polícia possa ser visualizado, sem restringir o acesso aos recursos de que a aplicação
necessita.

O comando "setenforce permissive" permite trocar o contexto para permissive.

O Log do SELinux pode ser visualizado com o comando sealert.

Um arquivo sem etiqueta pode ter o seu acesso negado. O contexto do arquivo pode ser
visto com o comando "ls -Z".

Para alterar o contexto de um arquivo ou diretório, o comando "chcon" pode ser usando.

Uma aplicação confinada pelo SELinux talvez precise ter o "interruptor boleano" habilitado
com o comando setsebool e verificado com o comando getsebool.

Problemas de Armazenamento
Existem diversos problemas que podem afetar o funcionamento das aplicações que são
executadas no Linux, e vários são ligados ao mau funcionamento dos dispositivos de
armazenamento, como discos rígidos, SSDs, RAID e LVM.

Armazenamento Degradado

É possível que ao longo do tempo uma mídia sofra uma diminuição na sua funcionalidade e
capacidades de armazenamento, ocasionando perda de dados ou corrupção dos arquivos,
tornando-se não confiável.

Isto pode acontecer com:

Discos rígidos que podem ter um aumento gradual de setores ruins;


Solid State Drives (SSD) que atingiram o seu limite de ciclos de gravação;
RAID, quando um dos discos falhou e necessita de reposição.

No caso dos discos rígidos, geralmente a controladora no disco marca os setores ruins para
não serem utilizados. No entanto, um aumento no número de setores podem indicar que uma
falha generalizada está próxima.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 585


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

No caso de SSDs, a vida útil depende de um cálculo que considera o número de ciclos, a
capacidade e a quantidade de dados que são gravados por ano. Estima-se que o restante do
computador se torne obsoleto antes que um SSD falhe por excesso de ciclos de gravação. De
qualquer forma, recomenda-se não utilizar um SSD para Swap, ou utilizar softwares de
desfragmentação de disco.

No caso de um RAID, dependendo da configuração do conjunto e da quantidade de discos,


ele suporta uma falha de disco de forma transparente para o usuário. O comando "mdadm -
d" pode ser útil para verificar falhas no conjunto de discos de um RAID.

Dispositivos Ausentes

Em alguns casos, os discos podem sumir no Linux. Não é comum, mas pode acontecer.

A primeira providência neste caso é verificar se o disco aparece com o comando "lsblk":

# lsblk

Pode acontecer do disco ser detectado com outra denominação, era "sbc" e virou "sdb", por
exemplo.

Se o disco não foi detectado pelo comando lsblk, pode-se escaniar todos os dispositivos PCI
anexados ao computador com o comando "lspci -M":

# lspci -M

Deve-se checar ainda se o descritor de arquivos do disco no diretório /dev não se corrompeu:

# ls -l /dev/sd*
brw-rw---- 1 root disk 8, 0 Jan 9 09:36 /dev/sda
brw-rw---- 1 root disk 8, 1 Jan 9 09:36 /dev/sda1

Os dispositivos de bloco tem o seu tipo de arquivo identificado com a letra "b". Se o descritor
de arquivos não for do tipo de bloco, o comando mknod pode refazer os descritores.

Volumes ausentes

Se um sistema utiliza o LVM, é possível acontecer o problema de volume ausente. O


comando pvscan pode retornar o UUID de um disco ausente. O comando pvcreate pode
trocar o volume ausente, os metadados do volume group podem ser reparados com
vgcfgrestore e o grupo reparado com o vgscan.

Ponto de Montagem Ausente

O ponto de montagem é um diretório na hierarquia do sistema de arquivos utilizado como


ancoragem para que um sistema de arquivos seja montado nele. Neste caso, o comando
mkdir com as permissões apropriadas pode criar o diretório a ser utilizado como ponto de

586 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

montagem.

Problemas de Desempenho

Uma mídia com problemas de desempenho pode impactar uma aplicação. Os comandos
ioping, iotop e sar podem monitorar o disco em busca de problemas de desempenho. O
algoritmo de armazenamento também pode influir no desempenho (noop, cfq, deadline).

Um deste de desempenho pode ser feito sem nenhuma aplicação em execução, e depois
com a aplicação principal em execução. O comando "sar" pode ser útil para fazer
comparações destes diferentes momentos, e o comando iotop útil para achar o vilão de E/S.

Dividir os dados em um conjunto de discos usando LVM ou RAID pode degradar um pouco o
desempenho de gravação, devido à paridade e checksum, mas pode agilizar muito num
ambiente onde a leitura de dados é importante.

Esgotamento de Recursos

O esgotamento de recursos pode ser em capacidade de armazenamento, ou inodes. De


qualquer forma, o comando "df" pode ser usado para determinar se o disco esgotou.

Para ver o espaço usado e livre:

$ df -h

Para ver se há inodes disponíveis:

$ df -ih

Integridade dos Discos

Além da capacidade de verificar e corrigir problemas no armazenamento, com os comandos


fsck e xfs_repair, o Linux também tem um programa para monitorar os setores defeituosos,
chamado badblocks:

# badblocks /dev/sda1

Esse comando mapeia os setores defeituosos e gera um arquivo de saída. Este arquivo pode
ser usado para alimentar os comandos e2fsck e mke2fs.

Discos SCSI

Os discos SCSI utilizam placas SCSI para se conectarem ao computador. Geralmente essas
placas possuem um barramento de alta velocidade e recursos para habilitar diferentes níveis
de RAID em hardware.

Por este motivo, nem sempre o hardware é detectado no momento da carga do sistema,
necessitando que algum módulo de Kernel específico seja carregado.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 587


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

As mensagens específicas sobre o que o Kernel encontrou no momento da carga do sistema


pode ser obtido com o comando dmesg:

# dmesg | grep sd
[1.417819] sd Attached scsi generic sg0 type 0
[1.417944] sd [sda] 134217728 512-byte logical blocks: (68.7
GB/64.0 GiB)
[1.417946] sd [sda] 4096-byte physical blocks
[1.417955] sd [sda] Write Protect is off
[1.417956] sd [sda] Mode Sense: 00 3a 00 00
[1.417970] sd [sda] Write cache: enabled, read cache: enabled,
doesn't support DPO or FUA
[1.418358] sda: sda1
[1.418556] sd [sda] Attached SCSI disk
[3.345202] EXT4-fs (sda1): mounted filesystem with ordered data
mode. Opts: (null)
[3.630876] EXT4-fs (sda1): re-mounted. Opts: errors=remount-ro

O comando udevadm pode ser utilizado para se saber qual o driver (módulo do kernel)
precisa ser carregado para o perfeito funcionamento do disco SCSI:

# udevadm info -an /dev/sda1|grep DRIVERS


DRIVERS=="sd"
DRIVERS=="ahci"

Depois de determinar o driver, é necessário verificar se o mesmo está carregado no Kernel


com o comando lsmod:

# lsmod | grep "sd\|ahci"


ahci 40960 1
libahci 32768 1 ahci

Como pode-se ver, o módulo "sd" não está carregado, mas isso não quer dizer que ele não
esteja disponível, pois é possível que alguns recursos estejam compilados diretamente no
Kernel.

Pode-se verificar isso consultando o arquivo modules.builtin, que contém a lista de


recursos compilados diretamente no Kernel:

$ cat /lib/modules/$(uname -r)/modules.builtin | grep sd


kernel/drivers/scsi/sd_mod.ko

Se os módulos necessários não estão carregados no Kernel, nem mesmo compilados nele, é
588 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

necessário utilizar o comando modprobe para carregar os drivers necessários ao


funcionamento do dispositivo.

Discos SATA

A interface de conexão Serial-ATA (SATA) é uma tecnologia de transferência de dados em


série. Essa tecnologia possui maior rapidez que sua antecessora (PATA) e permite ligar e
desligar dispositivos à quente (hot-swap).

As controladoras SATA geralmente são integradas à placa mãe dos computadores, e são
detectadas e configuradas automaticamente pelo Kernel do Linux há muitos anos.

Os discos SATA são suscetíveis ao desligamento constante devido ao gerenciamento de


energia. A tecnologia SMART pode reportar o excesso de desligamentos com o comando
"smartctl -a". O comando "hdparm -B 127" pode desligar o gerenciamento de energia do
disco e aumentar a sua vida útil.

O módulo "ahci" do Kernel é responsável por carregar o suporte aos discos SATA, que são
tratados como discos SCSI pelo Linux.

# lsmod | grep ahci


ahci 40960 1

Quando um disco SATA é ligado em hot-plug, com o computador ligado, é necessário habilitá-
lo reiniciando o sistema, ou enviando um sinal para o arquivo
/sys/class/scsi_host/hostN/scan. O N representa o número do disco SCSI.

O número do disco SCSI pode ser obtido com o comando "lsblk -S":

# lsblk -S
NAME HCTL TYPE VENDOR MODEL REV TRAN
sda 2:0:0:0 disk ATA Ubuntu Linux 18. P2J4 sata
sr0 3:0:0:0 rom Virtual DVD-ROM R103 sata

O número 2 é o número do host SCSI a ser usado para habilitar o disco. Para isto, o comando
echo deve ser usado:

# echo "- - -" > /sys/class/scsi_host/host2/scan

O sinal precisa ser três traços separados por espaço, que força o sistema a habilitar o disco
SATA.

RAID

O Linux implementa o RAID em software através do driver "md".

O status do do RAID pode ser verificado consultando arquivo /proc/mdstat:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 589


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

$ cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5]
[raid4] [multipath] [faulty]
md1 : active raid1 sdb1[1] sda1[2](F)
20478912 blocks [2/1] [_U]

Em alguns casos, quando se usa discos SATA para compor o conjunto do software RAID, se
há uma falha do disco, o RAID pode travar. Isto acontece quando o driver HBA não reconhece
que o disco foi desconectado.

Em RAID por Hardware, os discos são gerenciados por uma controladora própria, com
software em firmware, e drivers específicos.

Problemas com Firewall


O filtro de pacotes do Kernel pode ser responsável por problemas de conectividade e
funcionamento adequado das aplicações que fazem uso de rede.

Para diagnosticar os problemas de Firewall com Netfilter, pode-se verificar as regras em vigor
em ambas as pontas (cliente e servidor) com o comando "iptables -L" ou "iptables -S":

# iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT

O primeiro passo é confirmar a política das tabelas INPUT e OUTPUT. Se elas forem
restritivas, com uso do DROP, é necessário que existam regras liberando o tráfego para os
serviços que a aplicação necessita.

Se este for o caso, é importante salientar que um pacote precisa viajar da origem para o
destino, e vice-versa, pois a comunicação em rede envolve troca de pacotes.

Desta forma, uma regra com a tabela INPUT no host servidor, implica uma regra inversa no
host cliente na tabela OUTPUT. E uma regra OUTPUT em um host servidor, implica em uma
regra INPUT no host cliente.

Figura 55 - Firewall vice-versa


590 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

No servidor, pode ser necessária uma regra que se permita a entrada de pacotes em uma
determinada porta (exemplo porta 80). Isto implica que precisa existir uma regra de saída de
pacotes cuja origem seja a mesma porta do servidor:

# iptables -A INPUT -p tcp --dport 80 -j ACCEPT


# iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT

E no cliente, pode ser que ele necessite de uma regra que permita a saída de pacotes com
uma determinada porta de destivo (por exemplo, porta 80), e da mesma forma, deve permitir
entrada de pacotes cuja a origem seja a mesma porta de destino.

# iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT


# iptables -A INPUT -p tcp --sport 80 -j ACCEPT

Em hosts com políticas menos restritivas, com ACCEPT nas tabelas INPUT e OUTPUT, não é
necessário escrever uma regra para permitir o tráfego, pois ele já é liberado para tudo. Deve-
se apenas verificar se não há uma regra filtrando determinado protocolo ou porta.

Além das portas, é importante se verificar se não há filtros para os protocolos de transporte,
uma vez que dependendo da aplicação, sua comunicação pode se dar através de protocolos
distintos.

É comum uma aplicação fazer uso de mais de um protocolo e porta. Um servidor de VoIP
típico por exemplo utiliza a porta HTTPS (tcp/443) para gerenciamento, SIP (udp/5060), IAX2
(udp/4569), RDP (udp/1000:2000), etc.

Problemas de Permissão
Sem dúvida esse é um problema comum quando se executa uma aplicação.

Normalmente as aplicações quando são instaladas, criam um usuário no sistema, e todos


seus arquivos e diretórios serão de propriedade deste usuário. Assim, a aplicação é
executada por este usuário, de forma que ela terá acesso a todos os recursos de que
necessita.

Então, quando há um problema de permissão, é necessário verificar:

1. Qual é o usuário que executa a aplicação. O comando "ps aux" pode ser usado para se
determinar isso;

2. Qual o diretório ou arquivo que a aplicação está tentando obter acesso? Verifique o
arquivo de LOG de erro da aplicação;

3. Se não houver log de erro, uma lista dos arquivos abertos pela aplicação pode ser
consultada com o comando "lsof";

4. O diretório ou arquivo está com a propriedade correta configurada? O comando "ls -l"
pode ser útil para determinar a propriedade dos arquivos e do grupo. Utilize o comando
"chown" para alterar a propriedade do arquivo ou diretório, se for necessário;

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 591


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

5. É comum aplicações precisarem de um diretório temporário para tratar arquivos.


Verifique se há um diretório "temp" na estrutura de arquivos da aplicação. Se houver,
esse diretório precisa ter a propriedade do usuário que executa a aplicação;

6. Se os diretórios e arquivos da aplicação não tem a propriedade do usuário que executa


a aplicação, verifique se o usuário pertence ao grupo ao qual os arquivos pertencem,
com o comando "id". Se necessário troque a propriedade ou grupo para o usuário que
executa a aplicação, ou insira o usuário que executa a aplicação no grupo ao qual os
arquivos pertencem;

7. Se a aplicação cria novos arquivos, é necessário verificar se as permissões do diretório


contém alguma restrição de herança com as ACLs. O comando "getfacl -d" pode ser
útil para verificar isso.

Por exemplo, tome um servidor Web Apache Httpd como aplicação:

Para determinar o usuário que ele executa, utiliza-se o comando "ps aux":

$ ps aux | grep httpd


apache 12780 0.0 0.5 512140 12116 ? Sl 12:13 0:02
/usr/sbin/httpd -DFOREGROUND
apache 13984 0.0 0.5 314856 11464 ? Sl 16:05 0:00
/usr/sbin/httpd -DFOREGROUND
apache 14005 0.0 0.4 314552 9972 ? Sl 16:05 0:00
/usr/sbin/httpd -DFOREGROUND

Logo, o serviço é executado com o usuário "apache".

Tomemos como base que este servidor web tem uma pasta com o PhpMyAdmin. Pode-se
verificar que os arquivos na pasta são de propriedade do root:

$ ls -l
total 788
-rw-r--r-- 1 root root 1578 ago 22 2018 ajax.php
-rw-r--r-- 1 root root 1777 ago 22 2018 browse_foreigners.php
-rw-r--r-- 1 root root 22053 ago 22 2018 ChangeLog
-rw-r--r-- 1 root root 3194 ago 22 2018 changelog.php
( ... )

Isto pode ser bom, pois o servidor web tem permissões de ler os arquivos PHP, mas não pode
alterar seu conteúdo.

No entanto, a aplicação tem um diretório temporário chamado tmp:

drwxrwxr-x 3 root root 18 dez 7 2018 tmp

592 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Este diretório é interessante ter a propriedade do usuário apache, para que o servidor web
consiga gravar arquivos nele. O comando chown pode ser usado para alterar a propriedade
do diretório;

# chown -R apache:apache tmp

Desta forma, mantem-se as permissões dos arquivos, mas altera-se a sua propriedade:

drwxrwxr-x 3 apache apache 18 dez 7 2018 tmp

Problemas de Dependência
As dependências são tudo aquilo que o software necessita para executar, mas que não fazem
parte do seu pacote.

Por exemplo, um software pode ser dividido em módulos ou funcões, que podem ser
instalados separadamente, dependendo da função que se queira.

Para se ter exemplo da modularização de software, veja o banco de dados relacional


MariaDB, que tem um pacote chamado "mariadb", que fornece um cliente para acessar o
banco de dados. Esse pacote depende da instalação de outro chamado "mariadb-libs".

O pacote da versão servidora do MariaDB chama-se "mariadb-server", que depende da


instalação dos pacotes "mariadb" e "mariadb-libs".

Felizmente, os gerenciadores de pacotes como apt, dnf, yum e zypper fazem todo o trabalho
de instalar todos os pacotes necessários, resolvendo as dependências, quando se instala um
pacote.

O comando "yum deplist" fornece a lista de dependencias de um determinado pacote:

$ yum deplist mariadb


dependência: libc.so.6()(64bit)
dependência: libssl.so.10()(64bit)
dependência: mariadb-libs(x86-64) = 1:5.5.64-1.amzn2
( ... )

Versão

Os softwares que não foram descontinuados, geralmente são atualizados constantemente,


seja para corrigir problemas ou implementar novas funcionalidades.

Para manter o registro das atualizações, os desenvolvedores aplicam um número de versão


que identifica o software, de forma que pode-se saber se um determinado software está ou
não atualizado.

Geralmente o número de versão é composto de três numerais, sendo

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 593


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

[maior].[menor].[revisão]. O Kernel do Linux, por exemplo, em Janeiro de 2020, está na


versão 5.4.10.

Convencionou-se que um zero no primeiro número [maior], significa que o software é um


beta, e, portanto, está em fase de testes. Se somente há um número, como "versão 13",
significa um lançamento de software que ainda não teve correções de bugs. Uma versão com
número [maior].[menor] significa geralmente o lançamento de novas funcionalidades
discretas, e correções de vários bugs. Já uma versão com [maior].[menor].[revisão], indica
geralmente a correção de um bug específico.

Há diferentes softwares livres que os desenvolvedores utilizan para o controle de versão,


como o CVS, SVN e o GIT.

O importante, é saber que quanto maior a versão, mais atualizado o software está.

Atualização de Software

É sempre bom antes de proceder com uma atualização de versão da aplicação, fazer um
backup dos arquivos, configurações e bases de dados se for o caso. Não raro na mudança de
versão, há mudança nas bases de dados e arquivos de configuração, que podem ocasionar
perdas de dados, principalmente quando há customizações.

Se a aplicação foi instalada por um gerenciador de pacotes, ela pode ser atualizada se
houver uma nova versão diretamente pelo gerenciador de pacotes, com a opção "update".

Em caso de servidores, é sempre bom manter um servidor de testes para fazer as


atualizações ali primeiro e avaliar os resultados da atualização, e só então proceder com a
atualização no servidor de produção. Em ambientes computacionais na nuvem, é muito fácil
se criar uma cópia do servidor de produção para se realizar estes testes.

Outro favor que precisa ser levado em conta é o requisito de hardware da nova versão.
Dependendo da aplicação, um hardware pode se tornar obsoleto para rodar uma nova versão
de software, ou tornar o uso da aplicação sofrível na percepção do tempo de resposta ao
usuário.

Patching

Um patch é como um "remendo" que se faz no software, geralmente feito para corrigir algum
problema grave que não se pode esperar pelo ciclo normal de desenvolvimento. O patch
pode ser uma mudança nos arquivos de configuração, a execução de um determinado passo-
a-passo de correção de algo, uma alteração de algum script, a troca pontual de algum
arquivo, a correção de algumas linhas pontuais de código fonte ou a execução de algum
programa que corrige algo ou alguma base de dados.

Este tipo de correção geralmente só é aplicada por especialistas no software, e com


orientação direta do desenvolvedor. Dificilmente o usuário de uma aplicação fará a aplicação
de um patch de software.

Bibliotecas

Basicamente todas as aplicações modernas utilizam bibliotecas de software, de forma que


são dependentes das bibliotecas para executarem. Dificilmente algum pacote de software
594 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

será totalmente independente das bibliotecas.

Isto significa que se alguma biblioteca for alterada ou atualizada, erros no software podem
ocorrer, uma vez que as funções e procedimentos ao qual necessita podem não mais existir,
ou por alguma mudança na interface (número ou ordem dos parâmetros que as funções
recebem).

Quanto isso acontece, inevitavelmente há duas saídas:

1. Tentar atualizar o software da aplicação de forma que acompanhe a versão da


biblioteca;
2. Instalar a biblioteca antiga, na tentativa de que a aplicação continue funcionando, e
com o sistema estável;

Há ainda o problema das aplicações que são interpretadas, escritas em Python, Perl,
Javascript ou PHP. Essas aplicações podem fazer uso das bibliotecas disponíveis por uma
versão específica de um interpretador. Uma mudança na versão do interpretador, e
consequentemente na biblioteca que ele utiliza, pode fazer com que uma aplicação
interpretada pare de funcionar. Nestes casos, ou se tenta instalar uma versão anterior do
interpretador, ou tenta-se atualizar ou aplicar um patch no código fonte de aplicação;

Variáveis ambientais

As variáveis ambientais são variáveis que foram criadas em algum script no shell e foram
exportadas para serem lidas pela aplicação. O Linux conta com diversas variáveis
ambientais, que podem fazer muita diferença no comportamento das aplicações.

Essas variáveis podem ser criadas pela própria aplicação, e conter dados impressindíveis
para o seu correto funcionamento, ou mesmo variáveis do sistema.

Por exemplo, a variável PATH contém a lista de diretórios em que o shell fará a busca por
executáveis sem a necessidade de se informar o seu caminho completo absoluto. Se a
aplicação utilizar algum script que não contém o caminho completo dos executáveis que
executa, a variável PATH fará uma enorme diferença.

As variáveis de localização como LANG, LC_NUMERIC e LC_TIME, podem impactar a forma


de escrita de números decimais (se utiliza ponto ou virgula para separar os decimais) e
formato de data (MM-DD-YYYY ou DD-MM-YYYY).

As variáveis de time zone podem também impactar na hora local que a aplicação irá receber
do sistema.

Compatibilidade com o GCC

Quando se trata de aplicações que necessitam ser compiladas, a versão do GCC e as


bibliotecas GNU C podem impactar a compilação do software.

Além disso, nem todo software escrito em C pode ser compilado usando o GCC, uma vez que
o compilador usa a versão da linguagem C do sistema, que não é 100% compatível com o
padrão ISO C.

O GCC também usa os arquivos cabeçalho (headers) do sistema, que acompanham a versão

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 595


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

do Kernel instalado. Diferentes versões de Headers podem ocasionar problemas na


compilação.

Problemas com Repositórios

Os gerenciadores de pacotes baixam informações sobre os pacotes disponíveis nos


repositórios.

Não é comum, mas a base de dados local sobre os repositórios pode se corromper, gerando
erros quando se deseja instalar, remover ou atualizar pacotes de software.

Quando isso acontece, pode-se limpar os dados sobre os repositórios utilizando o comando
"clean" dos gerenciadores de pacote:

No Red Hat, CentOS:

# yum clean all

No Fedora:

# dnf clean all

No Debian e Ubuntu:

# apt-get clean

No OpenSuSE:

# zypper clean -a

Outros problemas relacionados aos gerenciadores de pacotes é a instalação de repositórios


de terceiros, não relacionadoa a distribuição Linux, tais como:

Instalação de pacotes instáveis - ou beta;


Atualização de bibliotecas não testadas que impactam todo o sistema;

De qualquer maneira, deve-se tomar cuidado com repositórios de terceiros.

Os repositórios instalados pode ser consultados nos diretórios:

No Ubuntu/Debian: /etc/apt/sources.list
No Red Hat/CentOS/Fedora: /etc/yum.repos.d
No OpenSuSE: /etc/zypp/repos.d

596 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Problemas com Hardware


O Linux possui algumas ferramentas interessantes para obter informações sobre o hardware:

Comando Descrição

lspci Lista todos os dispositivos PCI ligados ao computador;

lsusb Lista o HUB USB, e todos os dispositivos USB conectados;

lsblk Lista todos os dispositivos de bloco conectados (discos , sdd, etc)

lscpu Lista informação sobre a CPU

lsmem Lista o range de memória disponível

lshw Lista informações sobre todo o hardware

dmidecode Lista toda a informação da BIOS do computador;

Em especial, o comando lshw, pode dar informações completas sobre todo o hardware, e
possibilita exportar estes dados em XML, JSON ou mesmo em HTML para ser tratado ou
inventariado posteriormente.

Ele mostra informações completas sobre o hardware:

# lshw -C disk
*-disk
description: ATA Disk
product: Fedora Linux 30-
physical id: 0
bus info: scsi@0:0.0.0
logical name: /dev/sda
version: KW8R
serial: EQ8QSXXSWR9MV5EREG7N
size: 64GiB (68GB)
capabilities: partitioned partitioned:dos
configuration: ansiversion=5 logicalsectorsize=512
sectorsize=4096 signature=5d0ae329

A opção "-C" permite que se filtre os dados por classe de hardware.

Memoria

O primeiro passo para se diagnosticar problemas de memória é ver se a utilização de


memória pelo sistema e aplicações não ultrapassa frequentemente a quantidade disponível,
forçando o uso intenso de Swap. Os comandos "free" e "vmstat" podem fornecer um
diagnóstico pontual.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 597


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Para problemas intermitentes de depreciação na velocidade de resposta das aplicações,


pode-se usar o pacote "sar" para diagnosticar o uso da memória ao longo do tempo.

A memória RAM é um componente eletrônico sensível, e seu tipo de qualidade refletem


muito no desempenho do computador. O tipo de memória impacta diretamente na velicidade
de operação. Cada tipo de memória tem o seu barramento (ligação entre a memória e a
CPU), que impacta também diretamente no desempenho do computador. De nada adianta
uma CPU rápida com uma memória lenta.

Os problemas de hardware com memória geralmente são comuns quando se adiciona mais
memória, pois os computadores costumam "sentir" quando isso acontece, especialmente
adicionando-se uma placa de memória de um fabricante diferente.

Além disso, os componentes das placas de memória são bem sensíveis a picos de energia,
eletricidade estática, sujeira nos contatos da placa, etc.

Algumas distribuições mantém um Kernel especialmente feito para testar a memória RAM,
chamado "memtest" ou "memtest86" que pode ser acessado no Menu do Grub, quando se
inicia o computador.

Também existe o utilitário memtester, que realiza testes de memória, e pode ser instalado
pelo gerenciador de pacotes.

Impressoras

A instalação de impressoras já foi um problema no Linux, mas não é mais. A maioria destes
dispositivos é plug-and-play, e são detectados normalmente pelo sistema, seja através de
uma ligação USB ou via Wifi.

Se a impressora apresentar problemas de instalação, deve-se diagnosticar as conexões USB


(se a conexão for USB), ou se a impressora foi capaz de se conectar à rede Wifi
corretamente.

Algumas impressoras necessitam de instalação de driver manualmente, baixando-se do site


do fabricante, e instalando o pacote manualmente, com o utilitário rpm para Red
Hat/CentOS/Fedora ou dpkg no Debian/Ubuntu.

Outra possibilidade, é acessar a interface web do CUPS pelo navegador no endereço


127.0.0.1:631 para se tentar configurar manualmente a impressora.

Até as impressoras bem antigas sem suporte ao Linux podem ser instaladas com certo
esforço e manobras do administrador, utilizando os PostScript Printer Definitions de outras
impressoras compatíveis.

Vídeo

Há basicamente dois tipos de hardware de vídeo: aqueles que utilizam a própria CPU
principal para operações de vídeo, geralmente utilizados nas placas-mãe baratas, e aqueles
que utilizam uma CPU gráfica especializada chamada GPU (Graphics Processing Unit).

No segundo contexto, existem as placas de vídeo com GPUs super especializadas, utilizadas
em renderização de vídeo, jogos e mineração de criptomoedas.
598 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

É raro em uma distribuição moderna sofrer com problemas de falta de vídeo e falta de áudio,
já que até mesmo as GPUs especializadas são cobertas pelo Kernel do Linux e também pelos
fabricantes que dão suporte ao Linux.

De qualquer forma, pode-se investigar o buffer do Kernel, com o comando dmesg a procura
de erros, e também o comando lshw para se determinar o hardware de vídeo.

Em alguns casos, o fabricante da GPU disponibiliza algum driver que pode ser carregado
como módulo do Kernel, ou mesmo utilitários de configuração.

Portas de Comunicação

As portas de comunicação são usadas para conectar dispositivos através de portas seriais e
paralelas. Isto era comum há vinte anos, quando se usava modems externos ligados à portas
seriais para se conectar à Internet, e as impressoras usavam a porta paralela.

Raramente se utiliza hoje algum dispositivo em casa ou escritório que faça uso destas portas.
Na maioria dos casos é bem provável que estejam desabilitadas na BIOS/UEFI do
computador.

Mas, na Indústria ainda é comum encontrar máquinas que se interligam ao computador


através de cabos e portas seriais.

O diagnóstico das portas seriais pode ser feito através do comando "dmesg | grep tty", e
consultando o endereçamento de entrada e saída (/proc/ioports) e endereçamento de IRQs
(/proc/interrupts).

Uma vez que as portas seriais são detectadas pelo Kernel, e um descritor e arquivos é criado
no diretório /dev, o comando setserial pode ser usado para se configurar a porta serial,
especificando seu tipo e velocidade de operação.

USB

Os dispositivos USB são especialmente construídos para serem plug-and-play, com deteção
automática pelo sistema.

Quando há um problema na detecção e configuração destes dispositivos, a primeira coisa a


se fazer é verificar se o módulo que dá suporte ao USB está carregado no Kernel:

# lsmod | grep usb

Se o módulo não estiver carregado, isto pode ser feito com o comando modprobe.

Se o hardware foi detectado pelo Kernel, ele irá aparecer com o comando "lsusb -v".

Alguns dispositivos podem necessar da instalação de algum driver específico, como modems
3G/4G, impressoras, scanners, e outros. Neste caso, pode-se recorrer ao site do fabricante
para baixar o programa de instalação ou driver correto.

Mapeamento de Teclado

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 599


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Este é um problema comum em qualquer sistema operacional, quando se instala algo


diferente da versão OEM que o fabricante do computador disponibilizou, especialmente
quando se lida com a Internacionalização do sistema.

Em distribuições baseadas em Red Hat/CentOS/Fedora, pode-se listar todos os mapas com o


comando localectl list-keymaps:

$ localectl list-keymaps
ANSI-dvorak
al-plisi
( ... )

Uma vez escolhido o mapa de teclado, ele pode ser habilitado com a opção set-keymap:

$ localectl set-keymap br-abnt2

Já nas distribuições baseadas em Debian/Ubuntu, o comando "dpkg-reconfigure


keyboard-configuration" pode ser usado. Este comando entra em um menu para escolha e
teste de teclado.

Problemas de Compatibilidade de Hardware ou Software

Antes de comprar um novo hardware, é importante verificar há suporte para o Linux,


especialmente na versão de Kernel atual.

Alguns fabricantes disponibilizam drivers para serem compilados em versões muito antigas
de Kernel (2.x), e que nem de longe vão ser compiladas no Kernel 5.x, sem muito trabalho.
Alguns hardwares recém lançados também podem ser incompatíveis com alguns sistemas,
sendo necessário seu amadurecimento e adaptações.

Outra forma de incompatibilidade é de software: Determinadas aplicações devem ser


executadas em distribuições específicas, com versões e patchs de Kernel específicas. Alguns
ERP's e banco de dados costumam ter essas exigências de software.

Somos moldados por nossos pensamentos;


nos tornamos o que pensamos. Quando a mente é pura,
a alegria segue como uma sombra que nunca sai.
-- Buddha

600 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 601


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Automação e Script

602 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Obstáculos não bloqueiam o caminho.


Eles são o caminho
-- Provérbio Zen

Simulado
5.1 Implemente e Execute Scripts Bash
Básicos

Variáveis de Ambiente ou Globais


São conhecidas também como variáveis globais porque podem ser lidas por todos os
processos que o shell iniciar. Elas são carregadas e exportadas geralmente nos scripts de
perfil global ou de carga do Shell.

Lembre-se que o Bash é sensível ao uso de letras minúsculas ou maiúsculas, especialmente


ao se tratar de variáveis. Por isto convencionou-se que as variáveis ambientais são
declaradas em caixa alta.

O Bash mantém algumas variáveis ambientais importantes:

PATH

Mantém uma lista de diretórios que o shell procura pelos programas quando executados na
linha de comando;

HOME

Especifica o diretório HOME do usuário corrente;

USER

Especifica o login do usuário corrente;

TERM

Declara o tipo de terminal utilizado.

Neste exemplo utilizamos o comando set junto com o comando grep para ver o conteúdo da
variável PATH:

$ set | grep PATH


PATH=/sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/us
r/bin:/usr/X11R6/bin:/bin:/usr/games:/opt/gnome2/bin:/opt/gnome/b
in:/opt/kde3/bin:/usr/lib/java/jre/bin:/opt/gnome/bin

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 603


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Neste outro exemplo o conteúdo da variável HOME pode ser visto com o comando echo:

$ echo $HOME
/home/uiraribeiro

O mesmo pode ser usado para verificar a variável TERM:

$ echo $TERM
xterm-256color

E a variável USER é criada com a saída do programa "/usr/bin/id -un":

$ echo $USER
uiraribeiro

/usr/bin/id -un
uiraribeiro

Essas variáveis são configuradas em scripts globais que são executados pelo Linux, conforme
a tabela abaixo:

Variável Global Script Função

PATH /etc/profile Define os diretórios de busca quando um programa é executado

HOME /etc/bashrc Define o diretório HOME do usuário logado

TERM /etc/bashrc Define o tipo de terminal usado

USER /etc/profile Define o userid (login) do usuario logado.

Variáveis locais
O bash permite que se crie variáveis locais, que podem ser usadas nos scripts de shell.

Para criar uma variável, basta indicar seu nome, desde que não seja uma palavra reservada
do shell, seguido do símbolo de igual, e o valor, como no exemplo:

$ LIVRO=”Certificação Linux”

Não coloque espaços entre o nome da variável, o símbolo = e o seu conteúdo.

As variáveis podem ser declaradas em maiúsculo ou minúsculo. O que importante é que o


shell diferencia a forma como são escritas. Assim, "Nome" é diferente de "nome". Mas, por
604 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

uma questão que convenção, as variáveis são declaradas em maiúsculo.

Se o conteúdo for um texto, é desejável que ele esteja entre aspas simples ou duplas. Se o
texto não contém nenhuma variável, pouco importa se está contido em aspas simples ou
duplas:

$ FRASE1="Este é um teste"
$ FRASE2='de direfença entre aspas'
$ echo $FRASE1 $FRASE2
Este é um teste de diferença entre aspas

Mas se for utilizar as variáveis entre aspas, há diferença:

$ echo “$FRASE1 $FRASE2”


Este é um teste de diferença entre aspas

$ echo '$FRASE1 $FRASE2'


$FRASE1 $FRASE2

Então as aspas duplas expandem o conteúdo das variáveis, enquanto as aspas simples não.

Isto faz diferença se você quer, por exemplo, incluir um diretório na variável PATH:

$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt
/aws/bin:/home/ec2-user/bin

$ PATH="$PATH:/ora/oracle/admin/bin"

$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt
/aws/bin:/home/ec2-user/bin:/ora/oracle/admin/bin

Neste caso as aspas simples não funcionariam.

Para que uma variável possa ser utilizada por um programa, é preciso exportá-la para o
ambiente com o comando export.

Quando uma variável é exportada para o ambiente ela fica disponível para todos os
processos filhos do shell (todos os programas e aplicações que você executar no bash).

Cada vez que um processo é executado pelo shell, ele somente irá receber as variáveis
criadas pelo shell se elas forem exportadas com o comando export.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 605


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Assim o processo filho (o programa que desejamos executar) vai herdar do processo pai (o
shell) as variáveis criadas.

Veja o exemplo abaixo, onde criamos uma variável chamada BOOK:

$ BOOK=”Certificação Linux”
$ echo $BOOK
Certificação Linux

Se executarmos o bash novamente no mesmo terminal, para criar um processo filho, a


variável BOOK não existe, porque ela não foi exportada para os processos filhos:

$ bash
$ echo $BOOK

Algumas palavras não podem ser utilizadas como variáveis, pois são o que chamamos de
palavras reservadas do Bash, utilizadas como comandos internos. São elas: alias, alloc, bg,
bind, bindkey, break, breaksw, builtins, case, cd, chdir, command, complete, continue,
default, dirs, do, done, echo, echotc, elif, else, end, endif, endsw, esac, eval, exec, exit,
export, false, fc, fg, filetest, fi, for, foreach, getopts, glob, goto, hash, hashstat, history, hup,
if, jobid, jobs, kill, limit, local, log, login, logout, ls-F, nice, nohup, notify, onintr, popd,
printenv, pushd, pwd, read, readonly, rehash, repeat, return, sched, set, setenv, settc, setty,
setvar, shift, source, stop, suspend, switch, telltc, test, then, time, times, trap, true, type,
ulimit, umask, unalias, uncomplete, unhash, unlimit, unset, unsetenv, until, wait, where,
which, while.

Alterando as Variáveis de Shell


Qualquer variável pode ser alterada no Bash, bastando dar um novo valor para ela.

Neste exemplo, adicionaremos o diretório local simbolizado pelo ponto "." na variável PATH:

$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/ec2-
user/bin
$ PATH="$PATH:."
$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/ec2-
user/bin:.

Agora é possível executar qualquer programa em qualquer diretório corrente.

Como não alteramos o valor da variável PATH no arquivo /etc/profile, ao sair da sessão do
terminal, a alteração que fizemos será perdida. Então, a menos que um valor de variável seja
alterado em algum script do sistema ou do bash, seu valor será perdido após o término da

606 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

sessão de shell.

É importante ainda, relembrar que as variáveis que não são exportadas com o comando
export são denominadas variáveis locais, pois os programas executados pelo shell não têm
acesso a elas.

Para ilustrar bem isso, vamos criar uma variável com o meu nome:

$ NOME="Uirá Ribeiro"

No próprio shell, pode-se ver o seu conteúdo com o comando echo:

$ echo $NOME
Uirá Ribeiro

Observe que, enquanto não exportarmos a variável NOME com o comando export, ela não
ficará disponível para nenhum programa ou script de shell executado.

Por exemplo, se criarmos um script chamado meunome.sh com o seguinte conteúdo:

#!/bin/bash
echo “Meu nome é $NOME”

Para executar o script meunome.sh, é preciso alterar as permissões para execução:

$ chmod +x meunome.sh

Ao executar o meunome.sh, ele não irá conseguir ler o conteúdo da variável NOME que foi
criada anteriormente no shell:

$ ./meunome.sh
Meu nome é

Mas se a variável NOME for exportada:

$ export NOME

Se executarmos novamente o meunome.sh:

$ ./meunome.sh
Meu nome é Uirá Ribeiro
O comando export possibilitou que a variável NOME ficasse disponível para todos os

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 607


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

comandos e programas executados pelo shell que está em execução, ou seja, para todos os
processos filhos deste shell.

Para que fique bem claro, outro shell executado em outro terminal ou sessão não conseguirá
ler a variável NOME, porque ela não está em nenhum script de perfil ou de carga do Bash.

export
$ export [variável]

Como visto anteriormente, o comando export serve para exportar as variáveis criadas para
todos os processos filhos do Bash (programas).

Essa exportação é para uma área de memória especial compartilhada entre o Bash e os
programas que o Shell executa.

Se não for informada uma variável ou função como parâmetro, ele mostra todas as variáveis
exportadas. Ele também pode ser usado para se criar uma variável e exporta-la ao mesmo
tempo.

Uma variável criada no bash sem ser exportada não pode ser lida por nenhum processo ou
programa executado no mesmo terminal ou sessão do Shell.

Exemplo de como criar diretamente uma variável e exportar ao mesmo tempo:

$ export LIVRO="Certificação Linux"

$ export
declare -x LIVRO="Certificação Linux"
( ... )

env
$ env VARIAVEL=valor programa

O comando env é utilizado para executar um programa enviando para ele uma variável
ambiental.

Ele habilita que um determinado programa possa ler uma variável sem a necessidade de
criar a variável no Shell e posteriormente exportá-la com o comando export.

A opção -i diz para o env ignorar o ambiente herdado, sem alterar o conteúdo de qualquer
variável existente. É útil para alterar uma variável momentaneamente para um teste.

608 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Neste exemplo o programax é executado recebendo a variável HOME com o seu valor
alterado temporariamente e individualmente:

$ echo $HOME
/home/uiraribeiro
$ env HOME=/home/convidado2 programax

Mas ao visualizar o valor da variável HOME logo após a execução do programa, constata-se
que o seu conteúdo permanece inalterado, uma vez que só foi modificado no espaço de
memória que o programax foi capaz de enxergar:

$ echo $HOME
/home/uiraribeiro

O comando env também pode ser usado com a opção "-u", que remove a variável indicada
do ambiente. Para demonstrar, criamos um pequeno script que imprime a variável LIVRO:

$ cat script
#!/bin/bash
echo "O livro é: $LIVRO"

$ chmod +x script
$ export LIVRO="Certificação Linux"
$ ./script
O livro é: Certificação Linux

Ao usar o env com a opção -u, a variável LIVRO deixará de existir para o script quando
executado pelo env:

$ env -u LIVRO ./script


O livro é:

E ainda é possível usar a opção -i, que limpa todas as variáveis exportadas, executando o
programa em um ambiente totalmente limpo:

$ env -i ./script
O livro é:

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 609


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

set
$ set [variável]

O comando set informa uma lista de todas as variáveis locais, variáveis ambientais e funções
do shell.

Algumas opções do comando set alteram o comportamento do bash, a saber:

-C Previnem que a saída de um programa usando `>’, `>&’ e `<>’ regrave arquivos.
Faz o mesmo que a opção -o noclobber
-n Lê os comandos, mas não os executa. Útil para checar scripts. Faz o mesmo que a
opção -o noexec
-P Proíbe o shell de seguir links simbólicos. Faz o mesmo que a opção -o physical
-a Marca as variáveis modificadas ou criadas para export. Faz o mesmo que a opção -
o allexport
-o history Habilita guardar o histórico de comandos digitados.
-x Mostra o comando digitado e seu resultado
-m Habilita o controle de Tarefas (Jobs)
-e Sai do shell assim que o comando executado terminar com êxito
-n Lê os comandos, mas não os executa. Faz o mesmo que a opção -o noexec
-f Desabilita o uso de coringas * e ?. Faz o mesmo que a opção -o noglob

Ao utilizar as opções do set, o símbolo + pode ser utilizado para desabilitar as opções.

Esse comando além de servir para listar todas as variáveis, ele pode alterar o
comportamento do bash.

Veja os exemplos:

Para Listar as variáveis:

$ set
BASH=/bin/bash
BASH_VERSION='4.2.46(2)-release'
HISTCONTROL=ignoredups
HISTFILE=/home/ec2-user/.bash_history

Para não permitir que um arquivo seja regravado com o condutor ">""

$ set -C
$ cat teste.c > texto
610 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

-bash: texto: cannot overwrite existing file

Para imprimir o comando digitado e seu resultado:

$ set -x
$ echo $TERM
+ echo xterm-256color
xterm-256color

Para desabilitar isso, podemos usar a opção com o +x:

$ set +x

Para evitar que os comandos digitados sejam gravados no history, podemos usar a opção +o
history:

$ set +o history

Para voltar a gravar os comandos digitados no history:

$ set -o history

Observe a pegadinha que algumas opções são ativadas com o "-" e outras desativadas com o
"+" antes da opção.

Para evitar que o Bash faça uso de coringas, pode-se usar a opção -f ou -o noglob:

$ ls /bin/zip*
/bin/zip /bin/zipcloak /bin/zipgrep /bin/zipinfo
/bin/zipnote /bin/zipsplit
$ set -f
$ ls /bin/zip*
ls: não é possível acessar /bin/zip*: No such file or directory

É quase certo que as opções -C (noclobber) e -f (noglob) serão questões de prova.

É importante que você saiba que as opções que alteram o comportamento do comando set
não são permanentes se não estiverem em algum script de inicialização do bash. Algumas
distribuições customizam o comportamento do shell com o comando set nos arquivos
/etc/profile ou /etc/bashrc.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 611


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

unset
$ unset [variável]

O comando unset apaga uma variável ambiental da memória.

Ex.:

$ LIVRO="Certificação Linux"
$ echo $LIVRO
Certificação Linux
$ unset LIVRO
$ echo $LIVRO

printenv
$ printenv [variável]

O comando printenv imprime as variáveis ambientais.

Como parâmentro pode receber o nome de uma variável.

Exemplo:

$ printenv PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/ec2-
user/bin

Se não for informado nenhum parâmetro, imprime todas as variáveis ambientais.

Somente as variáveis exportadas com o comando export são impressas pelo printenv.

Veja o exemplo:

$ BOOK="Certificação CompTIA Linux"


$ printenv BOOK

Se a variável BOOK for exportada:

$ export BOOK

612 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

$ printenv BOOK
Certificação CompTIA Linux

Customizando e Escrevendo Scripts de


Shell

Para criar scripts é preciso enxergar o sistema como uma coleção de ferramentas que podem
interagir entre si para formar pequenos programas que irão auxiliar o dia a dia de trabalho e
a manutenção do sistema.

Estes pequenos programas são escritos em texto puro num editor de textos comum e não
precisam ser compilados. O shell é capaz de ler este programa como uma lista de comandos
que chamamos de "shell script".

Existem diversas linguagens de programação que interpretam os comandos de um arquivo


texto, tais como Python, Perl, Php, Javascript, etc.

Desta forma, a primeira linha do script deve indicar qual será o interpretador de comandos
que será utilizado para ler e executar o script.

Escolhendo o Interpretador de Script


#! shebang

Todo script que será executado no Shell deve começar com uma linha especial que inicia
com os caracteres “#!” seguido do caminho completo do interpretador de comandos. Esses
caracteres são conhecidos como "shebang".

Exemplo de um script de shell chamado bomdia:

#!/bin/bash
clear
echo “Olá $USER”
echo “Hoje é “;date
echo “Número de usuários conectados: ” ; who | wc -l
echo “Calendário”
cal
exit 0

Como estudado anteriormente, para um arquivo ser considerado executável é preciso que a
sua permissão seja alterada e o bit executável habilitado:

$ chmod +x bomdia

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 613


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Desta maneira o pequeno script poderá ser executado no prompt:

Olá uiraribeiro
Hoje é
sex set 27 10:56:54 -03 2019
Número de usuários conectados:
2
Calendário
setembro 2019
do se te qu qu se sá
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

Outros interpretadores podem ser invocados pela linha “#!”, tais como o /bin/sh,
/usr/bin/perl, /usr/bin/awk, dentre outros.

Quando um script é executado, o shell analisa o conteúdo da linha “#!” e carrega o


programa definido para interpretar o script.

Em um script de shell esta linha faz com que um novo programa do shell seja executado para
interpretar o script. Enquanto isso o shell que o executou fica em estado de espera.

O novo processo iniciado executa novamente os arquivos /etc/bashrc e ~/.bashrc.

Um aspecto importante é que o shell pai (em que o script foi chamado) pode passar variáveis
para o processo shell filho que irá executar de fato o script. Mas o shell filho não poderá
passar variáveis ou alterar o conteúdo delas para o processo pai. A herança é um caminho de
mão única de processo pai para processo filho.

É importante que a chamada na linha “#!” que define qual interpretador deve ser executado
esteja correta. Se o caminho estiver incorreto, o script poderá não ser executado.

Já os comentários nos scripts de Bash são sinalizados com apenas uma tralha "#". Todo o
restante da linha será ignorado pelo shell.

Permissões de Execução

Para que um script possa ser executado, ele precisa ter permissão de execução e o comando
chmod pode ser utilizado para habilitar esse bit para um script.

$ chmod +x script

Um script sempre será executado com as permissões do usuário que o executou, e de forma
614 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

alguma o Kernel obedecerá ao bit SUID ou SGID para script.

No entanto, o script poderá ser executado com as permissões de outro usuário se utilizado o
comando "sudo".

Veja o exemplo este script que imprime o UID do usuário:

#!/bin/bash
echo "eu sou:"
id

Se executado normalmente:

$ ./meuscript
eu sou:
uid=1000(uira) gid=1000(uira)
grupos=1000(uira),4(adm),10(wheel),190(systemd-journal)

Mas se executado com o sudo:

$ sudo ./meuscript
eu sou:
uid=0(root) gid=0(root) grupos=0(root)

Logo, deve-se tomar extremo cuidado ao se executar um script com o "sudo", uma vez que
todos os comandos que o script invoca serão executados com as permissões de outro
usuário, e, possivelmente o root.

Utilizou-se no exemplo o caminho relativo "./" para chamar o script, porque o diretório
corrente não está listado na variável PATH.

Variáveis Especiais

Uma característica importante dos scripts de shell é a possibilidade de confirmação da


execução com sucesso de um determinado comando. Ela é chamada de variável de retorno.

A variável de retorno é preenchida toda vez que um comando é executado. Se o valor


retornado for 0, o comando foi executado com sucesso. Se o valor for diferente de 0, algum
problema foi encontrado.

Para utilizar ler o valor da variável de retorno, ela precisa ser verificada imediatamente após
a execução do comando desejado.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 615


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Para verificar o conteúdo da variável de retorno:

$ echo $?
0

Veja o exemplo de um script muito simples que verifica se o arquivo /tmp/arquivoteste.txt


existe:

#!/bin/bash
cat /tmp/arquivoteste.txt
if [ $? = 0 ]; then
echo “o arquivo existe”
else
echo “o arquivo não existe”
fi

$ chmod +x testederetorno
$ ./testederetorno
o arquivo não existe

Se o arquivo /tmp/arquivoteste.txt existir, o comando cat irá retornar $? igual a 0 e a frase “o


arquivo existe” será impressa.

Outras variáveis especiais podem ser utilizadas:

Variável Para que serve

$# Retorna o número de argumentos que o programa recebeu.

$_ O sublinhado (underscore) contém o nome absoluto do arquivo do shell ou script que está sendo
executado como passado na lista de argumentos.

$? Variável de retorno do término da execução de um programa.

$$ Fornece o PID do processo do Shell.

$! Fornece o PID do último programa em execução em segundo plano.

$0 Retorna o nome do programa executado.

$n Retorna o argumento número n do programa.

$* Retorna todos os argumentos informados na execução do programa.


$@

Veja o script de exemplo em que se usa essas variáveis:

#!/bin/bash
616 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

echo "Meu nome é: $0"


echo "Eu tenho $# argumentos passados na minha execução"
echo "Este é o resultado da última execução: $_"
echo "O primeiro argumento é: $1"
echo "O segundo argumento é: $2"
echo "O terceiro argumento é: $3"
echo "Meu PID é: $$"
echo "Meus argumentos são: $@"
echo "Meus argumentos são: $*"

Ao ser executado, produzirá o seguinte resultado:

$ ./script um dois tres


Meu nome é: ./script
Eu tenho 3 argumentos passados na minha execução
Este é o resultado da última execução: Eu tenho 3 argumentos
passados na minha execução
O primeiro argumento é: um
O segundo argumento é: dois
O terceiro argumento é: tres
Meu PID é: 6210
Meus argumentos são: um dois tres
Meus argumentos são: um dois tres

Expansões de Shell

O shell permite também expansões, que são úteis para utilizar a


saída de comandos em variáveis.

Os símbolos que permitem a expansão de shell são:

$( )
` `

As expansões $( ) e ` ` fazem a mesma coisa.

Exemplo de expansão:

#!/bin/bash
HOJE=$(date "+%d/%m")

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 617


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

ID=`id -un`
echo "Bom dia $ID, hoje é $HOJE"

Ao executar esse pequeno script, pode-se ver que a saída dos comandos date e id foram
direcionadas para as variáveis HOJE e ID que puderam ser usadas posteriormente no script:

$ ./expansao
Bom dia uira, hoje é 12/01

Outro tipo de expansão é o ${ } que permite delimitar o nome de uma variável, e até fazer
substituições.

Exemplo:

$ bicho="gato"
$ echo $bicho
gato

Se quiser usar o conteúdo da variável junto com um texto, não dará certo:

$ echo "os $bichos foram passear"


os foram passear

Para que isto funcione, deve-se usar o nome da variável entre ${ }:

$ echo "os ${bicho}s foram passear"


os gatos foram passear

Também é possível fazer substituições, usando a barra comum "/", buscando uma ocorrência
e substituindo por outra:

$ echo "O ${bicho/gato/cachorro} latiu"


O cachorro latiu

source
$ source arquivo [argumentos]

618 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

O comando source é utilizado para ler um arquivo de biblioteca com várias funções para o
shell em um arquivo de script ou o prompt de comandos. Ele procura por arquivos de
biblioteca localizados nos diretórios da variável PATH ou de um arquivo específico.

Exemplos:

$ source funcoes.sh
$ source /caminho/ate/diretório/funcoes.sh arg1 arg2

No exemplo abaixo, vamos criar um arquivo chamado minhabiblioteca.sh com o seguinte


conteúdo:

#!/bin/bash
eh_o_root(){
[ $(id -u) -eq 0 ] && return $TRUE || return $FALSE
}

Este arquivo contém uma função chamada “eh_o_root” que retorna verdadeiro se o uid do
usuário logado for igual a zero (root) ou falso quando retorna outro valor.

Agora vamos criar um script chamado meuscript.sh que utilizará o minhabiblioteca.sh como
fonte de funções:

#!/bin/bash
# Vamos ler o minhabiblioteca.sh com o comando source
source minhabiblioteca.sh
eh_o_root && echo “Você é o Root.” || echo “Você é um usuário
comum.”

Agora vamos alterar a permissão do meuscript.sh para executável:

$ chmod +x meuscript.sh

Ao executar o meuscript.sh:

$ ./meuscript.sh
Você é um usuário comum.

O comando source é muito útil para ler uma biblioteca de funções ou variáveis que podem
ser utilizadas por diversos scripts de shell.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 619


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

O Comando test
$ test expressão

O comando test é uma grande ferramenta para testar condições. Com base na variável de
retorno do comando test, lógicas de programação podem ser montadas para executar algo
se uma condição for satisfeita ou não.

Ele pode testar condições em arquivos, permissões, textos, números, e até através de
expressões e fornece o resultado através da variável de retorno $?.

Neste exemplo o comando test verifica se 1 é menor que 2 (-lt = less than - menor que):

$ test 1 -lt 2
$ echo $?
0

Como a variável de retorno foi 0, o número 2 é menor que 1.

Neste outro exemplo ele testa com o "-d" se o arquivo /usr/src é um diretório:

$ test –d /usr/src
$ echo $?
0

As opções mais comuns do comando test são:

Opção Para que Serve Exemplo

-d /diretorio Verifica se um arquivo é um diretório e se ele $ test -d /etc


existe

-e arquivo Verifica se um arquivo existe, independente do $ test -e /etc/passwd


seu tipo

-f arquivo Verifica se um arquivo existe e se ele é comum $ test -f /etc/passwd

-z arquivo Verifica se o arquivo está vazio $ test -z /etc/groups

-n "$variavel" Verifica se o tamanho de um texto é maior que $ test -n "$LIVRO"


zero

-s arquivo Verifica se um arquivo existe e se seu tamanho é $ test -s /etc/passwd


maior que zero

s1 = s2 Verifica se um texto é igual a outro $ test "$LIVRO" = "Certificação


Linux"

620 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Opção Para que Serve Exemplo

s1 != s2 Verifica se um texto diferente de outro $ test "$LIVRO" != "Certificação


Linux"

x -eq y Verifica se um número x é igual a y $ VAR=10 ; test $VAR -eq 10

x -gt y Verifica se um número x é maior que y $ VAR=10 ; test $VAR -gt 9

x -lt y Verifica se um número x é menor que y $ VAR=10 ; test $VAR -lt 11

x -ne y Verifica se um número x não é igual y $ VAR=10 ; test $VAR -ne 11

x -ge y Verifica se um número x é maior ou igual a y $ VAR=10 ; test $VAR -ge 9

x -le y Verifica se um número x é menor ou igual a y $ VAR=10 ; test $VAR -le 11

expressão -a Verifica se ambas as expressões são verdadeiras $ test 10 -ge 9 -a 22 -gt 10; echo
expressão $?

expressão -o Verifica se uma OU expressão são verdadeiras $ test 10 -ge 11 -o 22 -gt 10;
expressão echo $?

arquivo1 -nt arquivo2 Verifica se o arquivo1 foi modificado depois de $ test arquivo1 -nt arquivo2
arquivo2 (mais novo)

arquivo1 -ot arquivo2 Verifica se o arquivo1 foi modificado antes de $ text arquivo1 -ot arquivo2
arquivo2 (mais velho)

-r arquivo Verifica se o arquivo tem permissão de leitura $ test -r aquivo

-w arquivo Verifica se o arquivo tem permissão de escrita $ test -w arquivo

-x arquivo Verifica se o arquivo tem permissão de execução $ test -x arquivo

-O arquivo Verifica se você é o dono do arquivo $ test -O arquivo

Uso de [ ] no lugar do "test"


O comando test pode ser abreviado com colchetes [ ]. Observe que deve haver um espaço
entre a expressão e os colchetes:

$ [ 10 -ge 8 ]
$ echo $?
0

Operadores || e &&
Os operadores (pipe pipe) II e && servem para verificar se a expressão à direita retorna
verdadeiro ou falso.

O operador && verifica se algo que está à sua direita é verdadeiro, e assim sendo executa o

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 621


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

comando à sua esquerda.

Neste exemplo, forçamos o retorno verdadeiro com o comando "true" que sempre irá
retornar verdadeiro:

$ true && echo "Deu certo"


Deu certo

Se usarmos o comando "false", que sempre retorna falso, o operador && não vai executar o
comando à esquerda:

$ false && echo "Deu certo"

O operador II verifica se algo que está à sua direita é falso, e assim sendo executa o
comando à sua esquerda.

Neste exemplo, forçamos o retorno verdadeiro com o comando true. Neste caso, o II não irá
executar nada.

$ true || echo "Deu certo"

Já agora, o forçando o retorno falso com o comando false, o II executa o comando echo:

$ false || echo "Deu certo"


Deu certo

Os operadores && e II também podem ser usados juntos:

$ test 100 -gt 99 && echo "SIM" || echo "NÃO"

Neste caso irá retornar SIM porque 100 é maior que 99.

if
if [ expressão ]; then comando else comando fi

Controles de fluxo (if) são comandos que testam algumas alternativas e, de acordo com o
resultado, executam comandos.

A lógica do comando if é “se isso for verdadeiro, faça isso, se não, faça aquilo”. Veja o
exemplo:

622 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

if [ $? = 0 ]; then
echo ‘O comando foi completado com sucesso...’
else
echo ‘O comando falhou.’
fi

Neste exemplo o if testa se o conteúdo da variável de retorno $? é 0. Caso positivo, executa


o comando echo "O comando foi completado com sucesso...". Se a condição for falsa,
executa o comando echo "O comando falhou.".

Diferente de outras linguagens, o if testa um comando e não uma condição. Assim sendo,
devemos utilizar o comando test em conjunto com o if. Geralmente escreve-se usando o
atalho dos colchetes [ ] para o comando test.

case
$ case expressão in padrão) comando ;; esac

O case é uma forma inteligente de se comparar o valor que algo com vários padrões.

Caso uma ocorrência for positiva, ele permite que se execute comandos.

Cada case é uma expressão que corresponde a um padrão.

O operador ")" termina uma lista de padrões e inicia uma lista de comandos.

O que separa um padrão de outro é ";;".

Ao fim do case, deve-se terminar com a instrução esac (case ao contrário).

Exemplo de um script que dependendo do UID do usuário imprime uma mensagem diferente:

#!/bin/bash
ID=$(id -u)
case "$ID" in
0)
echo "Você é o root.";
echo "Parabens!"
;;
1000)
echo "Você é o Uirá."
;;
100[1-9])
echo "Vocé é outro usuário"
esac

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 623


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

echo "fim";

Se o valor da variável ID for 0, irá imprimir uma mensagem de parabéns. Se for igual a 1000,
imprime "você é o Uirá". Se for entre 1001 e 1009, imprime "Você é outro usuário.

Se executado com o usuário uira, que tem o UID igual a 1000:

$ ./meucase
Você é o Uirá.
fim

Se executado como root:

$ sudo ./meucase
Você é o root.
Parabens!
fim

O case é melhor do que usar várias vezes o comando "if" para comparar algo com vários
padrões.

for
$ for algo; do comando; comando2; done

O shell possui estruturas para testar condições e executar determinadas sequências de


programas várias vezes (loop), até que a condição testada seja satisfeita.

Os três comandos que possibilitam isso são o for (até que), o while (enquanto for
verdadeiro) e until (enquanto for falso).

O comando for permite que laços (loops) sejam feitos para que um ou mais comandos sejam
executados até que uma determinada variável percorra todos os valores de uma dada lista.

Veja um exemplo simples:

$ for numero in um dois três quatro cinco


do
echo "Contando: $numero"
done

Contando: um
Contando: dois
624 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

Contando: três
Contando: quatro
Contando: cinco

O mesmo comando pode ser escrito em uma só linha:

$ for numero in um dois três quatro cinco; do echo "Contando:


$numero"; done

Veja o exemplo:

$ ls -1 > lista_arquivos.txt

Pode-se agora usar o for para executar diversos comandos para cada arquivo da lista:

$ for i in $(cat lista_arquivos.txt); do cp $i $i.backup; mv


$i.backup /tmp/backup; done;

Este laço atribui para a variável $i cada linha do arquivo lista_arquivos.txt.

A expressão $(comando) gera uma lista com resultado do comando. Tem o mesmo efeito
que utilizar o comando entre crases: `comando`.

Em seguida ele executa os comandos para renomear e mover os arquivos até que a lista
esteja completa.

Agora um exemplo um pouco mais complexo, com uso do for com if:

$ for i in `ls -1`; do if test -f $i; then echo “$i é um arquivo


“; else echo “$i não é um arquivo”; fi ; done

Desktop não é um arquivo


Documents não é um arquivo
Downloads não é um arquivo
HR_PROFESSOR.sql é um arquivo

Nesta linha, o resultado do comando ls -1 é colocado na variável $i; Depois cada linha da
variável $i é testada para saber se é um arquivo; se for verdadeiro, será exibida uma frase e,
se for falso, outra frase.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 625


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

while
$ while [ expressão ] ; do comando; comando; done

O while testa continuamente uma expressão, até que uma expressão tenha variável de
retorno igual a zero ou verdadeiro.

Neste exemplo, a variável $i ganha o valor inicial igual a zero.

Enquando (while) a condição do comando test representado pelos [ ] retornar zero


(verdadeiro), o laço do loop continuará a ser executado.

No laço a variável $i é incrementada, até que $i atinja a condição de não ser menor que 4:

$ i=0
$ while [ $i -lt 4 ]; do echo "conta $i" ; i=$[$i+1]; done
conta 0
conta 1
conta 2
conta 3

O while precisa ter uma condição de saída satisfeita, senão ficará em loop infinito.

until
$ until lista1 do comando; done

O comando until é o inverso ao comando while, mas ele executa algo enquanto o teste for
falso, ou com valores diferentes de zero.

Sua sintaxe é:

until [CONDIÇÃO]
do
[COMANDOS]
done

Exemplo:

#!/bin/bash
counter=0
until [ $counter -gt 3 ]
626 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

do
echo Counter: $counter
((counter++))
done

Ao ser executado:

$ ./contador
Counter: 0
Counter: 1
Counter: 2
Counter: 3

O until é útil para fazer um script esperar até que um comando não retorne mais erro, uma
vez que ele só é executado se o retorno do teste for diferente de zero.

O código zero de saída de um programa geralmente indica que ele foi executado com
sucesso.

Neste exemplo, o comando until é usado para esperar até que o host consiga pingar o
IP 8.8.8.8. Quando o comando ping conseguir pingar o host 8.8.8.8, ele retornará zero,
fazendo com que o processamento deixe o loop:

#!/bin/bash
until ping -c 1 8.8.8.8 &>/dev/null
do
echo "Esperando a rede..."
sleep 1
done
echo "A rede está no ar"

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 627


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Simulado
5.2 Controle de Versão com Git

O controle de versão do código fonte durante o desenvolvimento de um software é


importante, até mesmo para quem desenvolve software sem colaboração.

No mundo open-source, cuja premissa é distribuir o código-fonte livremente, para que possa
ser melhorado através da contribuição de diversos desenvolvedores pelo mundo, o controle
de versão é absolutamente necessário.

Existem diversos softwares de controle de versão gratuitos e de código aberto disponíveis,


como o CVS, SVN e o GIT.

Este último, criado por Linus Torvalds, tornou-se popular, uma vez que utiliza repositórios de
software gratuitos para fazer a distribuição e controle do código-fonte.

Vários repositórios surgiram, como o GitHub (adquirido pela Microsoft), GitLab, BitBucket,
dentre outros.

O pacote git pode set instalado no Linux utilizando o gerenciador de pacotes apt, yum ou
dnf.

Termos importantes para entender o Git:

Repositório remoto: é o repositório hospedado em algum servidor, que fará o


controle de usuários e controle de versão;
Workspace: é o diretório local, que permite o desenvolvedor trabalhar na sua cópia
local do código-fonte. Normalmente é um diretório comum na máquina;
Index: é um diretório escondido que fica no diretório de trabalho (workspace), com
nome ".git". O git mantém um índice dos arquivos do workspace, com checksum,
timestamps, etc. Além do índice, o git mantém uma cópia comprimida de todas as
versões de todos os os arquivos em forma de objeto.
Repositório Local: mantido dentro do diretório .git. Contém o histórico de cada
arquivo do projeto, na forma de um snapshot (uma imagem), a cada ação de
"commit".

Novo Projeto com o Git


Para criar um novo projeto e versiona-lo com o Git, é necessário seguir os seguintes passos:

Primeiro cria-se um diretório usando o comando mkdir:

$ mkdir projeto
$ cd projeto

628 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Depois pode-se inicializar o diretório para usar o Git, com o comando init:

$ git init
Initialized empty Git repository in /home/uira/projeto/.git/

A inicialização cria o diretório oculto .git:

$ ls -1 .git/
branches
config
description
HEAD
hooks
info
objects
refs

Depois, deve-se trocar o usuário e email usado no Git, para possibilitar o rastreio das
alterações, com o comando config:

$ git config --global user.name "Uira Ribeiro"


$ git config --global user.email "uribeiro@gmail.com"

Se usado a opção "--global", o git irá guardar a identificação em um arquivo chamado


.gitconfig no diretório home do usuário:

$ cat ~/.gitconfig
[user]
name = Uira Ribeiro
email = uribeiro@gmail.com

Agora pode-se usar o diretório do Workspace criado para escrever os programas.

Para adicionar um novo projeto a um repositório remoto, deve-se primeiro criar o repositório
remoto, através do site do GitHub.

Depois, pode-se usar o comando remote:

$ git remote add origin https://github.com/uira/projetoteste

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 629


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Clonar um Projeto no Github


Se não for iniciar um novo projeto, pode-se clonar um projeto existente no GitHub.

Para se clonar um projeto de repositório no GitHub (ou outro repositório), é necessário copiar
a URL do projeto.

Figura 56 - Github

O comando clone pode ser usado para se clonar um projeto de um repositório remoto:

$ git clone https://github.com/uiraribeiro/aulalpi.git aulas


Cloning into 'aulas'...
remote: Enumerating objects: 23, done.
remote: Total 23 (delta 0), reused 0 (delta 0), pack-reused 23
Unpacking objects: 100% (23/23), done.

Desta forma, todos os arquivos da última versão serão copiados para o diretório de trabalho
recém criado chamado "aulas".

Adicionar arquivos ao Índex


Toda a vez que se adicionar um arquivo ao projeto, ou alterar algum arquivo, é necessário
envia-lo ao índex.

Para adicionar arquivos ao índex, deve-se usar o comando "add". Ele precisa de um
parâmetro, que pode ser o nome do arquivo, ou um ponto "." ou asterisco "*" para se
designar toda a árvore de diretórios do Workspace.

$ git add *

O comando "add" não produz nenhuma saída.


630 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

Se não se deseja que o comando "add" adicione um determinado diretório ao índice, deve-se
criar um arquivo chamado .gitignore na raiz deste diretório.

Adicionar Arquivos ao Repositório Local


Depois de adicionar os arquivos ao índex, pode-se criar um snapshot (uma imagem) dos
arquivos adicionados ou alterados no repositório Git local com o comando "commit":

$ git commit -m "alteracoes"


[master a5a18f7] alteracoes
1 file changed, 2 insertions(+)

A opção "-m" do commit escreve um comentário no repositório, com observações sobre as


alterações feitas. Se não for utilizada a opção "-m", o git irá abrir o editor de textos padrão,
com a lista de arquivos alterados e adicionados, para que o usuário descreva as alterações
feitas.

Visualizando o Log de Alterações


O comando log pode ser usado para se visualizar as alterações no repositório.

$ git log
commit a5a18f7cff53e0c3b4ea6ecfd4d53f704652ba79 (HEAD -> master)
Author: Uira Ribeiro <uribeiro@gmail.com>
Date: Sun Jan 12 16:58:14 2020 -0300
alteracoes
commit 2323684b1a8e861250a4250dec8c400e0ce7ca6d (origin/master,
origin/HEAD)
Author: Prof. Uirá Ribeiro <atendimento@certificacaolinux.com.br>
Date: Fri Apr 27 18:25:30 2018 -0300
first commit

Enviando do Repositório Local para o Repositório Remoto


Uma vez que os arquivos do projeto estão prontos, pode-se compartilhar as alterações do
último commit com o repositório remoto, através do comando push.

O comando push requer que se tenha um usuário e senha no repositório remoto:

$ git push
Username for 'https://github.com': uira
Password for 'https://uiraribeiro@github.com':
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 2 threads

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 631


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Compressing objects: 100% (3/3), done.


Writing objects: 100% (3/3), 290 bytes | 290.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), completed with 2 local
objects.
To https://github.com/uiraribeiro/aulalpi.git
2323684..a5a18f7 master -> master

Desta forma, ele enumera os arquivos que foram alterados, adicionados e apagados,
comprime, e envia para o repositório remoto.

Atualizando o Repositório Local


Para atualizar o repositório e o Workspace local com as últimas alterações do repositório
remoto, pode-se usar o comando pull:

$ git pull
Already up to date.

Se não houverem alterações, o git não fará nada.

A figura 57 ilustra o processo de versionamento básico do Git:

Figura 57 - Git

Criando um Branch
Um branch é uma ramificação no controle de versão e no gerenciamento do desenvolvimento
do software.

632 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Basicamente ele permite a duplicação de um objeto sob controle de versão (um arquivo de
código-fonte ou um conjunto de diretórios), para que modificações possam ocorrer em
paralelo ao longo de várias ramificações.

Basicamente é uma metodologia que permite que vários desenvolvedores colaborem no


mesmo projeto, com a capacidade de separar o que cada um fez (cada qual com seu
branch), e depois juntar em algo que funcione, mesclando os diferentes branches.

Desta forma, o objetivo de se criar um branch é organizar a capacidade de mesclar os


diferentes branches através de um merge ao projeto pai.

O branch também permite que novos softwares surjam de projetos existentes. Quando isso
acontece é chamado de fork. Por exemplo, o MariaDB é um fork do MySQL.

O git automaticamente cria um branch principal, ou pai, chamado de "master".

Para se criar uma ramificação de arquivos do projeto, pode-se usar o comando "branch"
para criar uma ramificação:

$ git branch livro

Neste exemplo, criou-se um branch do projeto aula, chamado "livro". O git não usa o novo
branch até que se faça um checkout:

$ git checkout livro


Switched to branch 'livro'

A partir deste momento, todos os arquivos adicionados com o comando "add" e enviados ao
repositório local com commit, serão gravados no branch livro.

Mesclando um Branch
Uma vez que se deseja mesclar os arquivos de um branch ao projeto original (branch
master), pode-se usar o comando merge.

Para fazer isso, primeiro deve-se fazer o checkout no branch master:

$ git checkout master


Switched to branch 'master'
Your branch is up to date with 'origin/master'.

Pode-se confirmar qual é o branch de trabalho com o comando branch:

$ git branch
livro

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 633


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

* master

O asterisco (*) diz qual é o branch em que se está trabalhando.

Para mesclar o branch livro com o branch master, usa-se o comando merge:

$ git merge livro


Updating a5a18f7..5b7568d
Fast-forward
arquivo | 1 +
1 file changed, 1 insertion(+)
create mode 100644 arquivo

634 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Simulado
5.3 Processos e Conceitos de
Orquestração

A orquestração é um conceito que surgiu com advento da computação em nuvem,


especificamente em se tratando de DevOps.

Resumidamente, refere-se a automação de infraestrutura e entrega de software, através de


ferramentas e serviços automatizados, com objetivo de entregar os serviços computacionais
e aplicações de forma segura, íntegra, confiável e com alta disponibilidade, com mínimo de
intervenção humana e menor custo.

Quando implementada corretamente, a orquestração fornece uma maneira de aumentar a


velocidade e a agilidade da implantação de aplicativos e serviços de TI.

DevOps
O termo DevOps foi cunhado para se designar a junção do desenvolvimento de software com
as operações de infraestrutura.

O objetivo é garantir o funcionamento e a entrega do software do ambiente de


desenvolvimento para o ambiente de produção de maneira íntegra, com os seguintes
objetivos:

Integração contínua: o que funciona em desenvolvimento funciona em produção,


de maneira limpa, sem atrito e transparente;
Testes de software contínuos: Aquilo que foi testado em desenvolvimento
funcionará perfeitamente em produção;
Entrega de contínua: o software pode ser entregue do desenvolvimento para
produção sem erros, com integridade e controle de versão;
Infraestrutura como código: o ambiente de desenvolvimento e produção pode ser
replicado e restaurado através de ferramentas que automatizam e documentam o
processo;
Monitoramento contínuo: a infraestrutura e o funcionamento das aplicações pode
ser monitorado para aperfeiçoamento, balanceamento de carga e alta
disponibilidade;

Para que isto funcione, todo o ambiente de funcionamento do software precisa ser
controlado.

Isso inclui hardware, drivers de dispositivo, versões do sistema operacional, bibliotecas de


software e assim por diante.

As alterações no ambiente devem ser controladas e testadas de forma semelhante à forma


como as revisões de software são feitas.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 635


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Desta forma, o ambiente de desenvolvimento deve suportar os seguintes atributos:

Ser estático: uma imagem de contêiner é criada para o desenvolvimento do


software, e será imutável ao longo do desenvolvimento do software, para não criar
bugs ou induzir os desenvolvedores a erros por uma mudança no ambiente;
Ter controle de versão : tanto a imagem do contêiner, quando a sua configuração,
devem ser versionadas para que qualquer alteração possa ser detectada e
monitorada;
As entregas são completas: quando a imagem do contêiner está pronta para ir
para produção, a cópia em produção é paralisada, e a nova imagem é colocada em
produção em seu lugar de forma íntegra, sem updates.
Alta disponibilidade: os contêineres em produção podem ser replicados, parados e
iniciados de forma transparente, fornecendo alta disponibilidade do serviço, sem
paralisações para manutenções ou atualizações.

Automatização da infraestrutura
A orquestração permite o gerenciamento automatizado de configuração de infraestrutura,
especialmente em ambiente em nuvem, ou microserviços em contêineres.

A automação de infraestrutura permite:

Solucionar problemas da infraestrutura com mais facilidade;


Reverter o ambiente para uma versão anterior em caso de erros;
Melhorar o desempenho através do balanceamento de carga;
Diminuir custos, adaptando a necessidade real de recursos com a demanda;
Replicar o ambiente para desenvolvimento;
Aumentar o número de instâncias ou contêineres para absorver picos de demanda;

As ferramentas de orquestração de infraestrutura como Chef e Puppet podem fazer tudo isso
de forma automatizada.

Intraestrutura como Código


Os contêineres permitem que a infraestrutura seja codificada e configurada como um
programa.

Primeiro, determinam-se os requisitos do aplicativo, e com base neles, especifica-se a


infraestrutura do contêiner:

Qual será o sistema operacional do contêiner;


Qual bibliotecas serão usadas;
Quais serviços o contêiner irá executar;
Quais são as configuração de segurança;
Quais serão os utilitários de rede;

636 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Depois de criado o contêiner, a sua configuração é documentada através de uma ferramenta


de orquestração.

O gerenciamento de configuração é feito no portal da ferramenta de orquestração, e esses


dados são usados posteriormente para implantar e replicar os contêineres de aplicativos por
meio da automação de compilação.

A infraestrutura do contêiner é então versionada e congelada para fornecer um ambiente


imutável para o desenvolvimento e, em seguida, a produção.

Os seguintes passos são realizados:

1. O contêiner é criado à partir dos requisitos da aplicação;


2. A imagem do contêiner é congelada;
3. Uma ferramenta de orquestração documenta a configuração do contêiner;
4. O programador desenvolve a aplicação no contêiner;
5. O teste da aplicação é feito em desenvolvimento;
6. A aplicação é entregue com contêiner;
7. A ferramenta de orquestração utiliza o registro da configuração para criar/replicar o
contêiner em produção;
8. A ferramenta de orquestração monitora a aplicação e o contêiner;

Monitoramento dos Contêineres


As ferramentas de orquestração permitem o acompanhamento da integridade dos
contêineres de aplicativos de duas formas: com agentes de monitoramento e sem agentes de
monitoramento.

Algumas ferramentas de orquestração exigem que se instale no contêiner um software


agente que coleta dados e os envia para o servidor de orquestração para serem tratados e
gerar ações, alertas, gráficos e relatórios.

Ainda, outras ferramentas de orquestração fazem o monitoramento de contêineres sem


instalar nenhum tipo de software no contêiner, monitorando sua atividade através do
ambiente externo, através de softwares instalados na VM ou remotamente.

Há uma discussão de qual metodologia é melhor. Alguns acham que um agente de


monitoramento oferece mais confiabilidade no monitoramento, e outros acham que um
agente pode afetar negativamente um contêiner.

Inventário
Uma característica desejável nas ferramentas de orquestração é o inventário dos
contêineres, para que em caso de algum contêiner parar de funcionar, a ferramenta inicie
um processo de "auto-recuperação".

Desta forma, a ferramenta de orquestração poderá replicar automaticamente contêineres


adicionais de aplicativos de produção até que a aplicação funcione como desejado.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 637


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Ferramentas de Orquestração
Kubernetes

O Kubernetes é um sistema de orquestração desenvolvido pelo Google bem popular, gratuito


e de código-aberto.

Ele tem como objetivo fornecer os componentes e ferramentas para distribuir a carga da
execução de aplicativos em nuvens públicas e privadas agrupando contêineres em unidades
lógicas. Seus pontos fortes estão em crescimento flexível, portabilidade e fácil escalabilidade.

As suas principais características são:

Orquestração de Contêineres;
Orquestração de armazenamento;
Rollback automático;
IPv4/IPv6;
Load Balance;
Auto-recuperação;
Execução em lote (batch)
Escalonamento horizontal;

Docker Swarm

O Docker criou sua própria ferramenta de orquestração chamada Docker Swarm.

Ele foi projetado para ser simples, eficiente e com uma experiência de usuário bem
transparente.

As suas principais características são:

Orquestração de Contêineres;
Gerenciamento de clusters;
Rollback automático;
Load Balance;
Auto-recuperação;
Execução em lote (batch)
Escalonamento horizontal;

638 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Outros Livros do Autor


Certificação Linux LPIC-1

Livro para a Prova LPIC-101

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 639


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Livro para a Prova LPIC-102

640 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Certificação Red Hat

Livro para Certificação Red Hat EX-200

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 641


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Linux para Developers

Livro Desenvolvedores

642 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Certificação Linux Essentials

Livro para a Certificação LPI Linux Essentials

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 643


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Resumo dos Comandos


Comando Sintaxe Exemplo O que faz

apt-cache # apt-cache comando $ apt-cache search atari O utilitário apt-cache é para


[nome do pacote] manipular e obter informações
sobre os pacotes no cache do
apt.

apt-get # apt-get [opções] # apt-get install airsnort O comando apt-get (Advanced


[comando] [nome do Package Tool) é um
pacote] gerenciador avançado de
pacotes. Ele pode utilizar
arquivos locais ou remotos
para realizar instalação ou
atualização de pacotes. Desta
maneira é possível atualizar
todo o sistema Debian via ftp
ou http. Este gerenciador
também mantém informações
dos pacotes e suas
dependências.

arp $ arp $ arp Mostra o cache de MAC da


camada de enlace

at $ at # at -f comandos.txt teatime O comando at agenda tarefas


de forma semelhante ao cron.

awk $ awk [ opções ] -f $ awk –f arquivo-com-instrucoes O awk serve para processar


programa [ -- ] arquivo arquivo-de-entrada textos através de scripts
simples.

bg $ bg [número da $ bg 1 Coloca um processo parado em


tarefa] segundo plano.

blkid # blkid [opções] # blkid O comando blkid mostra os


dispositivo dispositivos de bloco (discos) e
os seus atributos como nome
do dispositivo, e outros
metadados.

case $ case expressão in case $rental in O case pode ser usado para
padrão) comando ;; esac "car") echo "For $rental rental escolhas multilevel if-then-
is Rs.20 per k/m.";; else-fi
"van") echo "For $rental rental
is Rs.10 per k/m.";;
*) echo "Sorry, I can not get a
$rental rental for you!";;
esac

cat $ cat [opções] arquivo $ cat > teste.txt O comando cat concatena
arquivos, imprime seu
conteúdo de tela e ainda pode
receber texto digitado pelo
teclado para um arquivo.

chage # chage [opções] login # chage –E 2016-05-23 cristiane O comando chage lida com a
expiração das contas de
usuário.

chgrp $ chgrp [opções] grupo $ chgrp -R users /home O comando chgrp altera o
arquivo grupo dos arquivos e
diretórios.

chkconfig # chkconfig [opções] # chkconfig --level 3 httpd on Adiciona ou retira um


determinado script ou serviço
de um determinado Runlevel.

chmod $ chmod [opções] { $ chmod 755 readme.txt Altera as permissões dos


letras, octal } arquivo arquivos

644 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Comando Sintaxe Exemplo O que faz

chown $ chown [opções] $ chown uira readme.txt O comando chown altera o


usuário.grupo arquivo dono do arquivo e pode
também alterar o grupo a que
este arquivo pertence.

cp $ cp [opções] origem $ cp arquivo1 arquivo2 O comando cp copia os


destino arquivos para outros arquivos
ou para diretórios. O comando
cp pode copiar um arquivo ou
múltiplos arquivos.

cpio $ cpio -o [parâmetros] # cpio -o < arquivo > saida O comando cpio é o programa
< arquivo > saída original do UNIX para a troca
de arquivos entre máquinas
por meio de mídias
magnéticas.

cut $ cut [opções] arquivo $ cut –d":" -f 1 /etc/passwd O comando cut corta os
arquivos em colunas

date $ date [opções] $ date O comando date pode ser


[MMDDhhmm[[CC]YY][.ss]] utilizado para mostrar a data
ou configurar a data do
sistema.

dd $ dd if=entradadedados $ dd if=/dev/sr0 O comando dd converte e


of=saidadedados of=/tmp/disco1.img copia arquivos, discos e
partições para um arquivo,
para um disco e dispositivos de
bloco. Ele é muito útil para
produzir cópias de partições e
discos inteiros em imagens,
bem como o inverso: gravar
imagens em discos.

debugfs # debugfs [opções] $ debugfs /dev/xvdb1 O programa debugfs é um


[dispositivo] depurador interativo do
sistema de arquivos ext2.

depmod $ depmod [opções] $ depmod -a O depmod cria uma lista de


dependências de módulos do
kernel.

df $ df [opções] $ df -h / O comando df (disk free)


[diretórios] mostra a capacidade utilizada
de um sistema de arquivos em
termos de espaço e inodes.

diff $ diff arquivos $ diff arquivo1 arquivo2 O comando diff compara


arquivos

dig $ dig endereço $ dig certificacaolinux.com.br O comando dig (domain


information groper) é uma
poderosa e flexível ferramenta
para busca de informações em
servidores de resolução de
nomes. Ela é usualmente
utilizada para diagnosticar
problemas de configuração de
servidores.

dmesg $ dmesg [opções] $ dmesg O dmesg é o utilitário capaz de


ler o buffer (pequena área de
memória) das telas do
processo de carga do sistema,
chamado de dmesg. Após o
processo de carga do sistema
este utilitário irá mostrar as
mensagens de carga do
sistema, mas ele é capaz de ler
qualquer mensagem
importante que o Kernel
armazene em seu buffer.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 645


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Comando Sintaxe Exemplo O que faz

dnf # dnf [opções] # dnf install nginx A distribuição Linux Fedora fez
[comando] [nome do o seu próprio gerenciador de
pacote] pacotes baseado em Red Hat,
chamado DNF.

dpkg # dpkg [opções] ação # dpkg -i acct_6.3.5-32_i386.deb O utilitário dpkg é responsável


pelo gerenciamento de pacotes
em sistemas Debian.

dpkg-reconfigure # dpkg-reconfigure # dpkg-reconfigure debconf O comando dpkg-reconfigure


[nome do pacote] reconfigura um pacote já
instalado no sistema. Ele tem o
mesmo efeito da re-instalação
do pacote.

du $ du [opções] $ du –h /home O comando du (disk usage) vai


[diretórios] fornecer uma lista detalhada
sobre a utilização do disco.

dumpe2fs # dumpe2fs [opções] # dumpe2fs /dev/xvdb1 O programa dumpe2fs mostra


[dispositivo] as informações do superbloco
do sistema de arquivos do
dispositivo desejado.

e2fsck # e2fsck [opções] $ e2fsck /dev/xvdb1 O comando e2fsck é usado


dispositivo para checar o sistema de
arquivos ext2, ext3 e ext4. Ele
é a versão do fsck para os
sistemas de arquivos baseados
no sistema de arquivos ext.

e2label # e2label dispositivo # e2label /dev/xvdb1 meudisco O programa e2label muda o


label label de um disco formatado
com ext2, ext3 e ext4.

echo $ echo parâmetro $ echo "Bom dia" O comando echo imprime algo
na tela ou na saída padrão. Ele
também pode ser usado para
imprimir os valores de
variáveis.

Editor de Textos $ vi [opções] arquivo $ vi nomedoarquivo O vi é um editor de textos


vi/vim ASCII poderoso e muito usado
na interface de caractere do
Linux para edição de arquivos
e programas. Seu uso não é
muito intuitivo à primeira vista,
mas a edição simples de textos
pode ser feita usando poucos
comandos.

edquota # edquota [opções] # edquota Edita as contas de uma conta


usuário/grupo de usuário

egrep $ egrep [opções] $ grep "^[0-9]{4}-05-[0-9]{2}" O comando egrep funciona


expressão-regular file como a opção -E do grep.
arquivos

env $ env VARIAVEL=valor $ env HOME="/home/uira" programa O comando env é utilizado


programa para executar um programa
enviando para ele uma variável
ambiental.

ethtool $ ethtool [opções] $ ethtool Controla o hardware de rede


dispositivo

export $ export [variável] $ export LIVRO="Certificação O comando export serve para


Linux" exportar as variáveis criadas
para todos os processos filhos
do Bash (programas).

646 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Comando Sintaxe Exemplo O que faz

fdisk # fdisk [dispositivo] # fdisk /dev/xvdb O fdisk é um utilitário para


criar, listar, alterar e apagar
partições de disco.

fg $ fg [número da $ fg 2 O comando fg faz exatamente


tarefa] o oposto do comando bg,
colocando a tarefa ou processo
em segundo plano em primeiro
plano e ligada a um terminal.

fgrep $ fgrep [opções] $ fgrep batata * O comando fgrep também é


chave-procura arquivos parecido com o grep, mas ele
não suporta expressões
regulares, procurando somente
uma chave de busca ou um
texto comum nos arquivos.

file $ file [opções] $ file test1.c O comando file é utilizado para


arquivo se determinar qual é o tipo de
arquivo informado como
parâmetro.

find $ find [caminho] $ find / -name uira O comando find procura por
[expressão] arquivos e diretórios no
sistema de arquivos.
Dependendo do tamanho do
sistema de arquivos, esse
comando pode ser muito
demorado.

for $ for algo; do $ for numero in um dois três O shell possui estruturas para
comando; comando2; done quatro cinco; do echo $numero; done testar condições e executar
determinadas sequências de
programas várias vezes (loop),
até que a condição testada
seja satisfeita.

free $ free [opções] $ free -h O comando free mostra a


quantidade de memória total
disponível, quantidade em uso
e quantidade disponível para
uso.

fsck # fsck [opcões] [-t # fsck /dev/sda1 O comando fsck é na verdade


tipo] [opções do tipo] um "wrapper" que serve para
dispositivo chamar outros comandos que
são variações do fsck para
vários tipos de sistemas de
arquivos.

gdisk # gdisk [opções] # gdisk /dev/xvdb O comando gdisk é similar ao


dispositivo fdisk e permite manipular e
criar partições. Ele foi
especialmente criado para lidar
com partições GPT.

getent $ getent base [chave $ getent passwd uiraribeiro O comando getent é utilizado
de busca] para acessar as bases de
dados de contas de usuário,
senhas e grupos de usuários.

getfacl $ getfacl [opções] $ getfacl arquivo Lista as ACLs de um arquivo ou


arquivo diretório

grep $ grep [opções] $ grep uira /etc/passwd O comando grep filtra as linhas
expressão-regular de um determinado arquivo
arquivos procurando por uma expressão
regular como padrão.

groupadd # groupadd # groupadd contabilidade O comando groupadd cria um


nome_do_grupo novo grupo de usuários.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 647


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Comando Sintaxe Exemplo O que faz

groupdel # groupdel # groupdel contabilidade Este comando apaga um grupo


nome_do_grupo do sistema.

groupmod # groupmod [opção] # groupmod -n vendas marketing O comando groupmod modifica


nome_do_grupo as configurações de um grupo.

grub-install # grub-install # grub-install /dev/sda Este comando instala o GRUB 1


[opções] partição como gerenciador de boot no
MBR do primeiro disco e cria o
diretório /boot/grub. Este
diretório contém os arquivos
necessários para o seu
funcionamento.

head $ head [opções] $ head —n 50 readme.txt O comando head serve para ler
arquivo somente as primeiras linhas de
um arquivo.

host $ host [ opções ] $ host O comando host é utilizado


endereço www.certificacaolinux.com.br para fazer buscar no serviço de
resolução de nomes DNS.

hostnamectl # hostnamectl comando $ hostnamectl Visualiza ou configura o


parâmetro hostname

hwclock # hwclock [opções] # hwclock Visualiza ou configura o relógio


de máquina e o relógio do
sistema.

if if [ expressão ]; then if [ $? = 0 ]; then echo "teste" Controles de fluxo (if) são


comando else comando fi fi comandos que testam algumas
alternativas e, de acordo com
o resultado, executam
comandos.

iftop $ iftop $ iftop Ferramenta de monitoramento


de rede

insmod # insmod [arquivo] $ insmod Instala um módulo do Kernel


[opções.] kernel/drivers/net/wireless/airo.ko

ip # ip [ opções ] Objeto # ip addr show Este comando é uma poderosa


{ comando } ferramenta para mostrar e
manipular as interfaces de
rede, configurar endereços IP,
alterar as tabelas de rotas e
criar túneis.

iptables iptables [opções] # iptables -A INPUT -p tcp -- Cria, apaga ou modifica regras
[chain] [regras] dport 80 -j ACCEPT no Netfilter

jobs $ jobs [opções] $ jobs -l O comando jobs lista os


[número_da_tarefa] processos que estão em
execução em segundo plano.
Se um número da tarefa é
fornecido o comando retornará
as informações pertinentes
somente à tarefa em questão.

kill $ kill [-sinal | -s $ kill -9 2314 O comando kill envia sinais


sinal] PID para os processos.

ldconfig # ldconfig [opções] # ldconfig O utilitário ldconfig cria os links


diretório_de_bibliotecas e refaz o índice das bibliotecas
dinâmicas do arquivo
/etc/ld.so.cache. Ele procura
por bibliotecas nos diretórios
/usr/lib e /lib, assim como nos
diretórios listados em
/etc/ld.so.conf, bem como o
diretório informado na linha de
comando.

648 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Comando Sintaxe Exemplo O que faz

ldd $ ldd programa $ ldd /bin/bash O comando ldd – List Dynamic


Dependencies – fornece uma
lista das dependências
dinâmicas que um
determinado programa
precisa. Ele irá retornar o
nome da biblioteca
compartilhada e sua
localização esperada.

less $ less [opções] $ less /var/log/messages O comando less serve para


arquivo paginar o conteúdo de um
arquivo, e permite que você
navegue para frente e para
trás.

ln $ ln [opções] arquivo $ ln -s arquivo link O comando ln pode ser usado


link para criar links simbólicos ou
físicos.

locate $ locate arquivo $ locate passwd O comando locate pode ser


usado para encontrar arquivos
no sistema através de um
banco de dados de arquivos
que o comando locate
mantém.

logger # logger [-DSI] [-f # logger –p user.info “o usuário O logger serve para enviar
arquivo] [-pri p] [-t uribeiro ativou o circuito 3 da mensagens para o rsyslogd.
tag] [-socket u] segurança”
[Mensagem ... ]

ls $ ls [opções] $ ls -m /boot/*138* O comando ls serve


[arquivo] basicamente para listar
arquivos e conteúdo de
diretórios.

lsblk $ lsblk [opções] $ lsblk O comando lsblk mostra


[dispositivo] informações de todos os
dispositivos conectados no
sistema.

lsdev $ lsdev $ lsdev Mostra informações sobre os


dispositivos

lsmod $ lsmod $ lsmod O lsmod é um utilitário simples


que formata o conteúdo do
diretório /proc/modules,
mostrando os módulos do
Kernel que estão carregados
na memória.

lsof $ lsof [opções] $ lsof -i O comando lsof mostra os


arquivos em aberto do
sistema, incluindo sockets e
pipes.

lspci $ lspci [opções] $ lspci A lista das placas de expansão


encontradas poderá ser lida
através do comando lspci.

lsusb $ lsusb [opções] $ lsusb O lsusb é útil para mostrar


todas as informações sobre os
dispositivos USB conectados a
este tipo de barramento.

md5sum $ md5sum [opções] $ md5sum image.iso O programa md5sum serve


arquivo para fazer a mesma coisa que
o sha256sum, mas com a
soma de verificação usando o
algorítimo MD5.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 649


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Comando Sintaxe Exemplo O que faz

mkdir $ mkdir [opcões] $ mkdir documentos O comando mkdir cria um ou


diretório mais diretórios abaixo do
diretório local. Você precisa ter
permissões para escrita no
diretório para executar o
mkdir.

mkfs # mkfs [-t tipo] $ mkfs.ext4 /dev/sda1 O comando mkfs formata a


[opções] dispositivo partição criada pelo fdisk /
gdisk / parted com o sistema
de arquivos.

mkswap # mkswap [opções] # mkswap /dev/sdb1 O comando mkswap prepara o


dispositivo [tamanho] dispositivo para ser usado
como área de memória virtual
(swap).

modinfo $ modinfo módulo $ modinfo netfilter Mostra informações sobre um


módulo do kernel

modprobe # modprobe módulo # modprobe ipv6 O modprobe adiciona ou


remove um módulo no Kernel
do Linux. Ele procura por
módulos no diretório
/lib/modules/versão_do_kernel.

more $ more arquivo $ more arquivo Faz a paginação de um arquivo

mount $ mount [opções] $ sudo mount /dev/xvdb1 /mnt O comando mount é utilizado
{dispositivo} para montar um dispositivo na
{diretório} hierarquia do sistema de
arquivos do Linux de forma
manual.

mtr $ mtr $ mtr 8.8.8.8 Combina o ping com o


traceroute

mv $mv [opções] origem $ mv arquivo1 arquivo2 O mv move ou renomeia


destino arquivos e diretórios.

nano $ nano arquivo $ nano supermercado O nano é um editor pequeno e


amigável. Ele não tem modo
de comando. Tudo é simples
como editar um textos no
Bloco de Notas do Windows.

netcat $ netcat [ opções ] ip $ nc google.com 80 O comando netcat ou nc é um


[ porta ] utilitário utilizado para fazer
“quase tudo” quando se trata
dos protocolos TCP e UDP.

netstat $ netstat [opções] $ netstat -anp Fornece estatísticas de rede,


rotas e conexões.

nice $ nice [-n $ nice updatedb & O comando nice ajusta o


ajuste_de_prioridade] tempo disponível de CPU de
[comando] um processo para mais ou para
menos prioridade.

nmap $ nmap [opções] alvo $ nmap localhost O nmap é uma ferramenta


poderosa para descobrir as
portas abertas em hosts locais
ou remotos.

nohup $ nohup [comando] $ nohup find / -name uira* > O comando nohup bloqueia o
arquivos_econtrados & sinal de desligamento, para
que os processos não sejam
terminados quando a conexão
com o terminal é
desconectada.

nslookup $ nslookup [opções] $ nslookup Ferramenta de diagnóstico de


nome servidor_dns certificacaolinux.com.br resolução de nomes

650 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Comando Sintaxe Exemplo O que faz

parted # parted [opções] $ parted /dev/xvdb O comando parted foi


[dispositivo [comando] desenvolvido para particionar
[opções]] e redimensionar partições de
discos.

passwd # passwd [opção] login # passwd uira O comando passwd entra com
a senha para uma determinada
conta de usuário.

paste $ paste [opções] $ paste arquivo1 arquivo2 O comando paste (colar) é


arquivo1 arquivo2 utilizado para concatenar as
linhas de diversos arquivos em
colunas verticais.

pgrep $ pgrep [expressão] $ pgrep nginx O comando pgrep permite que


se procure por expressões na
lista de processos em
execução e retorna o PID do
processo em questão. Ele
também permite que sinais
sejam enviados para esses
processos elencados na
expressão de busca.

ping e ping6 # ping ip $ ping 192.168.1.1 O comando ping utiliza o


protocolo ICMP para enviar
mensagens ECHO REQUEST e
receber ECHO RESPONSE para
testar a conexão entre o
sistema e outra máquina na
rede.

pkill $ pkill [-sinal ] PID $ kill -9 2314 O comando kill envia sinais
para os processos.

printenv $ printenv [variável] $ printenv Imprime as variáveis


ambientais na saída padrão

printf $ printf FORMATO $ printf "Meu nome é" "Uirá" Formata e imprime dados
ARGUMENTO

ps $ ps [opções] $ ps aux O comando ps gera uma lista


com todos os processos em
execução e seus atributos.

quota # quota [opções] $ quota Mostra o uso de cotas de disco


usuário/grupo

quotacheck # quotacheck [opções] $ quotacheck Repara os arquivos de indexes


[dispositivo] de cotas

quotaoff # quotaoff [opções] $ quotaoff Desabilita as cotas


[dispositivos]

quotaon # quotaon [opções] $ quotaon Habilita as cotas


[dispositivos]

renice $ renice [+/-] # renice -1 987 -u daemon root -p O comando renice ajusta a
ajuste_prioridade 32 prioridade de execução de
[opções] PID/Usuário processos em execução.

repquota # repquota [opções] $ repquota Gera relatório de uso de cotas


dispositivo de um usuário

resize2fs # resize2fs [opções] # resize2fs /dev/xvdb1 O programa resize2fs


[dispositivo] [tamanho] redimensionará os sistemas de
arquivos ext2, ext3 ou ext4.

rm $ rm [opções] arquivo $ rm arquivo1 O comando rm é utilizado para


remover arquivos.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 651


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Comando Sintaxe Exemplo O que faz

rmdir $ rmdir [opções] $ rmdir favoritos O comando rmdir remove um


diretório ou mais diretórios vazios do
sistema.

rmmod # rmmod módulo $ rmmod Remove um módulo no Kernel


kernel/drivers/net/wireless/airo.ko

route $ route [opções] $ route add default gw 10.0.0.1 Manipula a tabela de rotas
comando alvo

rpm # rpm [modo] [opções] # rpm -ivh yum.rpm O comando rpm é responsável
[pacotes] pela instalação, remoção,
atualização, conversão dos
pacotes.

rsync $ rsync [opções] $ rsync arquivo Copia arquivos remotamente


origem destino uira@servidor:/tmp

scp $ scp [opções] origem $ scp arquivo uira@servidor:/tmp Copia arquivos remotamente
destino

sed $ sed [opções] $ sed "s/velho/novo/" arquivo O comando sed é um editor de


{script} [arquivos] textos simples utilizado para
fazer pequenas
transformações no conteúdo
dos arquivos. Ele utiliza o
padrão POSIX ERE para
expressões regulares.

service # service script # service httpd stop Para iniciar ou parar um


comando serviço de forma elegante no
System V, devemos usar o
comando service.

set $ set [variável] $ set O comando set informa uma


lista de todas as variáveis
locais, variáveis ambientais e
funções do shell.

setfacl $ setfacl [opções] $ setfacl -m u:uiraribeiro:rwx Configura as permissões de


ugo:nome:permissões arquivo ACL
arquivos

sftp sftp [opções] origem $ sftp uira@servidor Cliente de FTP seguro


destino

sha256sum $ sha256sum [opções] $ sha256sum ubuntu-19.04-desktop- Calcula um hash de um


arquivo amd64.iso determinado arquivo, de forma
que o bash pode ser
comparado para se verificar
sua autenticidade e
integridade.

sha512sum $ sha512sum [opções] $ sha512sum arquivo.iso O programa sha512sum faz a


arquivo mesma coisa que o
sha256sum, mas com hashes
de 512 bits. Ele aumenta a
confiabilidade do hash,
especialmente em arquivos
grandes.

shutdown # shutdown [opções] # shutdown —r now O comando shutdown é


horário [mensagem] utilizado para desligar ou
reiniciar o sistema com
horários determinados.

sort $ sort [opções] $ sort -n arquivo O comando sort ordena as


arquivo linhas de um arquivo.

652 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Comando Sintaxe Exemplo O que faz

source $ source arquivo $ source funcoes.sh O comando source é utilizado


[argumentos] para ler um arquivo de
biblioteca com várias funções
para o shell em um arquivo de
script ou o prompt de
comandos.

ss $ ss [opções] $ ss -s O comando ss é
extremamente útil para
investigar os sockets,
fornecendo várias informações
sobre a rede. Ele é a evolução
do comando netstat do antigo
Net-tools.

su $ su [opções] [-] $ su - O comando su executa o shell


[usuário] como se fosse outro usuário.

sudo $ sudo [opções] $ sudo su - O comando sudo executa um


comando determinado comando como se
fosse outro usuário.

sudoedit $ sudoedit arquivo $ sudoedit aquivo Edita arquivos com a conta de


outro usuário

systemctl $ systemctl [opções] # systemctl status cron O comando systemctl é quem


comando [nome] comanda o show do sistema de
gerenciamento de serviços do
systemd.

tail $ tail [opções] $ tail –n 50 /var/log/messages O comando tail (do inglês


arquivo cauda) visualiza as últimas 10
linhas de um arquivo.

tar $ tar [opções] origem $ tar cvzf arquivo.tar.gz Ferramenta de backup de


destino diretorio arquivos

tee $ tee [opções] $ folha_pagamento | tee folha.txt O comando tee recebe dados
arquivos | imprime_boleto | tee boleto.txt | de uma entrada padrão, grava
lpr 2> erros.log o que recebeu em um arquivo
e ainda envia para sua saída
padrão. É utilizado para gravar
a saída padrão de um comando
em um arquivo e ainda enviar
esta saída para outro
comando.

test $ test expressão $ test 1 -gt 0 Realiza testes condicionais de


expressões

time $ time comando $ time find / -name uira Mostra o tempo de execução
de um programa.

timedatectl $ timedatectl $ timedatectl Controla o sistema de hora e


data

top $ top [opções] $ top Outra forma interessante de


ver os processos em execução
é com o comando top.

touch $ touch [opções] $ touch config.txt O comando touch serve para


arquivo alterar os metadados de tempo
dos arquivos, modificando a
data de último acesso ou de
modificação dos arquivos.
Também serve para criar
novos arquivos vazios.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 653


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Comando Sintaxe Exemplo O que faz

tr $ tr [opções] $ cat supermercado | tr a-z A-Z O comando tr faz a troca de


variável_busca uma variável por outra
variável_troca especificada. Este comando
não trabalha diretamente com
arquivos, portanto deve ser
utilizado com a saída padrão
de outro comando, com o
condutor pipe.

tracepath e $ tracepath ip $ tracepath www.kernel.org O tracepath traça um caminho


tracepath6 entre o host e um endereço de
rede e tenta descobrir qual é o
MTU (Unidade Máxima de
Transmissão). O tracepath é
um bom substituto do
traceroute.

traceroute e # traceroute [opções] $ traceroute www.kernel.org Este comando retorna os


traceroute6 ip endereços das máquinas e
outros dispositivos de rede por
onde os pacotes passam para
chegar a um determinado
destino. Este caminho é
conhecido como rota de
endereços.

tune2fs # tune2fs [opções] $ tune2fs -l O comando tune2fs ajusta


dispositivo vários parâmetros nos
sistemas de arquivo ext2, ext3,
or ext4.

tzselect $ tzselect $ tzselect Altera a timezone do sistema

ulimit $ ulimit [opções] $ ulimit -a O utilitário ulimit configura ou


recurso mostra as configurações sobre
o uso dos recursos no sistema,
como tamanho dos arquivos
que podem ser salvos pelo
shell ou por processos filhos.

umask $ umask [modo] $ umask 27 Quando novos arquivos são


criados no sistema, eles são
criados com permissões
definidas gravadas no perfil de
cada usuário e configuradas
pelo comando umask.

umount $ umount [opções] { $ umount /mnt O comando umount é utilizado


dispositivo | ponto de para desmontar dispositivos
montagem } montados pelo comando
mount.

unlink $ unlink arquivo $ unlink arquivo Desfaz um link de arquivo

unset $ unset [variável] $ unset LIVRO O comando unset apaga uma


variável ambiental da
memória.

until $ until lista1 do $ until [ $counter -gt 3 ]do O comando until é o inverso ao
comando; done echo Counter: $counter comando while, mas ele
((counter++))done executa algo enquanto o teste
for falso, ou com valores
diferentes de zero.

updatedb $ updatedb # updatedb O comando updatedb atualiza


a base de dados do locate com
o caminho e nome dos
arquivos e diretórios do
sistema de arquivos.

654 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Comando Sintaxe Exemplo O que faz

uptime $ uptime [opções] $ uptime O comando uptime mostra


quanto tempo o sistema está
no ar, a quantidade de usuário
logados e a carga da CPU.

useradd # useradd [opções] $ useradd uira O comando useradd cria


login contas de usuário no sistema.
Seu único parâmetro
obrigatório é o login do
usuário.

userdel # userdel [opção] # userdel –r arthur O comando userdel remove a


login conta de um determinado
usuário do sistema. Ele remove
a conta dos arquivos
/etc/passwd, /etc/shadow e
/etc/group.

usermod # usermod [opções] # usermod –c “ArthurRibeiro” O comando usermod modifica


login arthur as configurações de uma
determinada conta de usuário.

vmstat $ vmstat $ vmstat Mostra as estatísticas de


memória virtual

w $ w $ w O utilitário w fornece uma lista


de quais usuários estão
conectados.

wc $ wc [opções] $ wc /etc/passwd O comando wc pode ser usado


[arquivo] para contar as linhas, palavras
e caracteres de um ou mais
arquivos.

whereis $ whereis palavra $ whereis ifconfig Procura nos diretórios


especificados na variável
$PATH e $MANPATH por
executáveis, código-fonte ou
manuais de uma palavra
especificada.

which $ which comando $ which httpd O comando which recebe como


argumento o nome de um
comando e trás como
resultado a localização no
disco deste comando.Ele é
especialmente útil quando
você estiver testando diversas
versões de um comando e
deseja ter certeza de que está
executando a versão correta.

while $ while [ expressão ] $ while [ $i -lt 4 ]; do echo O while testa continuamente


; do comando; comando; "conta $i" ; i=$[$i+1]; done uma expressão, até que uma
done expressão tenha variável de
retorno igual a zero ou
verdadeiro.

who $ who $ who O utilitário who pode ser


utilizado para mostrar quais
são os usuários logados no
sistema.

whois $ whois endereço $ whois certificacaolinux.com.br Mostra informações das bases


de dados, de IPs ou domínios.

xargs $ xargs comando $ cat supermercado | xargs echo O xargs executa o comando ou
[opções] argumento programa e passa como
argumento para esse comando
o que foi recebido como
entrada padrão.

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 655


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Comando Sintaxe Exemplo O que faz

xfs_db $ xfs_db [opções] # xfs_db -x /dev/sdg2 O comando xfs_db faz um


dispositivo debug nos sistemas de arquivo
XFS.

xfs_fsr # xfs_fsr [opções] $ xfs_fsr /dev/sdb1 O comando xfs_fsr melhora a


dispositivo organização dos sistemas de
arquivos XFS montados. O
algoritmo de reorganização
opera em um arquivo por vez,
compactando ou melhorando o
layout das extensões do
arquivo (blocos contíguos de
dados do arquivo). Funciona
como o desfragmentador de
arquivos do XFS.

xfs_repair # xfs_repair [opções] # xfs_repair /dev/xvdb1 O comando xfs_repair é o fsck


dispositivo do sistema de arquivos XFS.

yum # yum [opções] # yum install dnf Gerenciador de pacotes para


[comando] [nome do as distribuições baseadas em
pacote] RPM.

zypper # zypper # zypper install bind Assim como o Fedora fez seu
[opções_globais] comando próprio gerenciador de
[opções_do_comando] pacotes, o OpenSuSE fez o seu
[argumentos] gerenciador chamado Zypper.

Totó, acho que não estamos mais no Kansas.


-- Frase do filme O Mágico de Oz.

656 Licenciado para: Roque Laécio dos Santos


Souza
90587243520
Certificação CompTIA Linux+

Índice Remissívo

1 4
1.1 Conceitos do Processo de Boot do Linux 4.1 Analise as Propriedades do Sistema e
15 Corrija como corresponder 501
1.2 Instalar, Configurar e Monitorar Módulos 4.2 Analise de Processos do Sistema para
do Kernel 32 Otimizar o Desempenho 556
1.3 Configurar e verificar parâmetros de 4.3 Analise e Solução de Problemas dos
conexão de rede 39 Usuárioss 571
1.4 Gerenciar Armazenamento no Linux 70 4.4 Analizar e Solucionar Problemas de
1.5 - Conceitos e tecnologias de Núvem e Aplicativos e Hardware 584
Virtualização 130
1.6 – Configurar as Opções de Localização 5
143 5.1 Implemente e Execute Scripts Bash
Básicos 603
2 5.2 Controle de Versão com Git 627
2.1 Fazer as instalações, configurações, 5.3 Processos e Conceitos de Orquestração
atualizações e remoções de software 161 634
2.2 Gerenciando Usuários e Grupos e
Arquivos Relacionados 199 A
2.3 Crie, modifique e redirecione arquivos Acessibilidade 370
227 Acesso Direto a Memória (DMA) 328
2.4 Gerencia de Serviços 277 Ajustando o Ambiente de Trabalho dos
2.5 Linux como Servidor 296 Usuários 220
2.6 Automatizar e Agendar Trabalhos no Ajuste de desempenho de I/O 542
Linux 304 Ajustes no Kernel com Sysctl 554
2.7 Operação de dispositivos Linux 319 Alterando o Dono dos Arquivos e Grupos 387
2.8 Interface Gráfica e Acessibilidade 347 Análise de Pacotes 533
AppArmor 401
3 apt-cache 181
3.1 Aplique as permissões de Usuário e apt-get 180
Propriedade 377 arp 530
3.2 Configurar e Implementar o Acesso e Arquivos de Configuração do Bash e Perfil
Métodos de Autenticação 415 216
3.3 Melhores Práticas de Segurança em Arquivos tarball 167
Linux 436 at 309
3.4 Serviços de LOG 454 awk 251
3.5 Implementar e Configurar os Firewalls do
Linux 466 B
3.6 Backup, Restauração e Compressão de bg 317
Arquivos 487 blkid 121
BLOCK 321
Buffer de Mensagens do Kernel 337
BUS 321

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 657


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Dispositivos de Armazenamento 329


C dmesg 38
case 623 dnf 197
cat 239 dpkg 178
chage 209, 407 dpkg-reconfigure 179
chgrp 388 du 103, 537
chkconfig 281 dumpe2fs 108
chmod 384
chown 387 E
CLASS 321
e2fsck 107
Cliente VPN 434
e2label 109
Comparação entre System V e Systemd 296
echo 249
Compiladores 161
Editor de Textos vi/vim 228
Compilando Software 170
edquota 225
Configurações de Hardware 325
egrep 237
Configurando Dispositivos PCI 331
env 608
Configurando Dispositivos USB 333
Escolhendo o Interpretador de Script #!
Configurar o Cliente DNS 44
shebang 613
Controle de Listas de Acesso - ACLs 389
Estatísticas de Disco com iostat 539
Cópia Remota de Arquivos 275
cp 264
cpio 492
/
/etc/fstab 121
Criando Partições 86
/etc/localtime 144
Criando Sistemas de Arquivos 93
Criptografia de Dados 423
Criptografia de Disco 449 E
cron 305 ethtool 65
Customizando e Escrevendo Scripts de Shell Executando Programas com a Permissão de
613 Outro Usuário 411
cut 256 Expansões de Shell 617
export 608
D
date 148 F
dd 493 Fail2ban 485
debugfs 107 Falhas de Disco 545
Definindo o Runlevel Padrão 283 fdisk 86
Definindo Quais Processos Serão Executados Ferramentas de Diagnóstico 56
por Cada runlevel 280 Ferramentas de Diagnóstico de Rede 523
DenyHosts 486 Ferramentas de VM 143
depmod 37 fg 317
Desabilitando Serviços não Necessários 444 fgrep 238
Desktops Gráficos 362 file 262
Desvantagens do System V init Daemon 286 Filesystem Hierarchy Standard 97
DEVICES 321 find 269
df 102, 536 Firewalld 477
diff 268 FIRMWARE 321
dig 63 Fluxos de Dados, Condutores e
Redirecionamentos 242
658 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

for 624 IPSet 483


free 550 iptables 470
fsck 105
J
G jobs 318
gdisk 92 Journal do Systemd 461
Gerenciador de Boot 17
Gerenciamento de Arquivos Red Hat e YUM K
185 Kernel Panic! 31
Gerenciamento de Bibliotecas kill 314
Compartilhadas 172
Gerenciamento de Pacotes Debian 176 L
Gerenciamento de Senhas 213, 406
Layout do Disco 71
getent 212
ldconfig 175
getfacl 390
ldd 174
GPIO 338
LD_LIBRARY_PATH 175
Grand Unified Boot Loader (GRUB – 2) 25
less 241
Grand Unified Boot Loader (GRUB Legado -
Ligação 69
1) 21
Limitando as contas de usuário 404
grep 235
Links Simbólicos e Hard Links 273
groupadd 211
ln 274
groupdel 211
Localizando Arquivos 269
groupmod 212
locate 271
grub-install 24
logger 459
GUID Partition Table (GPT) 77
Logical Volume Manager - LVM 123
ls 261
H lsblk 119
HALD 322 lsdev 333
head 240 lsmod 34
host 62 lsof 527, 567
hostnamectl 293 lspci 331
Hotplug x Coldplug 323 lsusb 337
hwclock 150
M
I Master Boot Record - MBR 74
Identificando Qual Usuário Está Conectado md5sum 498
ou Última Conexão 214 mkdir 267
if 622 mkfs 94
iftop 529 mkswap 552
Impressoras e Impressão no Linux 339 Modificando as Permissões de Arquivos 384
Informações de Hardware no diretório /proc Modificar a Prioridade dos Processos 568
325 modinfo 36
initramfs 23 modprobe 35
insmod 35 MODULE 321
Instalando um Gerenciador de Boot 21 Monitoramento e Auditoria 452
Integridade do Sistema de Arquivos 101 Monitoramento e Configuração de
ip 51 Armazenamento 535

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 659


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Monitoramento e Configuração de CPU 545 ping e ping6 57


Monitoramento e Configuração de Memória pkill 566
549 Ponte 70
Montando e Desmontando Sistemas de Portas Abertas com netstat, ss e lsof 526
Arquivos 114 Portas de Entrada/Saída IO (Input / Output)
more 241 327
mount 115 POWER 322
mtr 531 printenv 612
Multipath 86 printf 257
Multitarefa Problemas de Acesso, Autenticação e
- Processos em Primeiro e Segundo Planos Ambiente 576
312 Processando fluxos de texto usando filtros
- processos em segundo plano e processos 231
em primeiro plano 315 Processo de Carga do Kernel 16
mv 265 Procurando por Executáveis com SUID/SGID
410
N Procurar por Arquivos Texto Usando
nano 230 Expressões Regulares 231
netcat 528 Protocolos de Acesso Remoto 368
netstat 58 ps 558
Network Manager 47
nice 569 Q
nmap 527 quota 223
nohup 319 quotacheck 225
nslookup 64 quotaoff 224
quotaon 224
O
O Comando test 620 R
Operações com Arquivos e Diretórios 259 Regras Dinâmicas 485
Out-of-Memory-Killer 553 renice 570
Outros gerenciadores de boot 30 Reparar o Sistema de Arquivos 105
Outros Livros do Autor 638 Repositórios no Debian 183
repquota 226
P Requisição de Interrupção (IRQ) 326
Padrões de Caractere 154 resize2fs 108
PAM 416 Resolução de Nomes 42
parted 90 Resumo dos Comandos 643
Partições 74 rm 266
Partições e Sistemas de Arquivos no Linux rmdir 267
77 rmmod 36
passwd 207 Rodízio de Logs com Logrotate 460
paste 258 route 54
Perda de Senha de Root 555 rpm 186
Permissões de Contexto 395 rsync 276, 494
Permissões de Execução 614 Runlevels 279
Permissões Especiais de Execução 409
pgrep 563
660 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+

Trabalhando com Cotas 220


S tracepath e tracepath6 525
scp 275, 495 traceroute e traceroute6 524
Secure Shell - SSH 426 tune2fs 112
sed 253 tzselect 146
SELinux 395
Separação de Dados do Sistema e de U
Aplicativo 448
UDEV 322
service 282
UFW 481
set 609
ulimit 404
setfacl 391
umask 382
sftp 496
umount 118
sha256sum 497
unlink 268
sha512sum 497
unset 611
shutdown 285
until 626
Sinais 313
updatedb 271
Sintonia Fina na Rede 67
uptime 547
Sistemas de Arquivos 82
useradd 204
Situações Especiais de Erro nos Processos
userdel 207
567
usermod 206
skel 204
Uso de coringas 263
Software RAID 128
sort 250
source 618
V
Variáveis de Localização 152
ss 60
Variáveis Especiais 615
su 413
Verificando a Integridade 497
sudo 412
Virtualização em Contêineres 140
sudoedit 414
vmlinuz 24
Swap 551
vmstat 553
SYSFS 320
sysstat 548
systemctl 288 W
Systemd 286 w 216
systemd-analyze 295 Wayland 360
Systemd Mount Units 293 wc 257
System V Init Daemon 278 whereis 272
which 272
T while 625
who 216
Tabela de Rotas 54
whois 532
tail 240
tar 491
tee 248 X
time 566 xargs 247
timedatectl 151 xfs_db 113
top 564 xfs_fsr 111
touch 259 xfs_repair 110
tr 249

Licenciado para: Roque Laécio dos Santos Proibido copiar/distribuir 661


Souza - 90587243520
Prof. Uirá Ribeiro
Licenciado para: Roque Laécio dos Santos Souza - 90587243520 - rlaecio@hotmail.com

Y Z
yum 191 zypper 198

662 Licenciado para: Roque Laécio dos Santos


Souza
90587243520

Você também pode gostar