Escolar Documentos
Profissional Documentos
Cultura Documentos
Uirá Ribeiro
ISBN 978-85-921455-4-5
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.
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.
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 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é.
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.
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!
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.”
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.
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.
Meus cumprimentos,
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.
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
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+
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+
xiii
Prof. Uirá Ribeiro
xiv
Certificação CompTIA Linux+
xv
Prof. Uirá Ribeiro
xvi
Certificação CompTIA Linux+
xvii
Prof. Uirá Ribeiro
xviii
Certificação CompTIA Linux+
xix
Prof. Uirá Ribeiro
xx
Certificação CompTIA Linux+
xxi
Prof. Uirá Ribeiro
xxii
Certificação CompTIA Linux+
xxiii
Prof. Uirá Ribeiro
xxiv
Certificação CompTIA Linux+
xxv
Prof. Uirá Ribeiro
xxvi
Certificação CompTIA Linux+
xxvii
Prof. Uirá Ribeiro
xxviii
Certificação CompTIA Linux+
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.
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.
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.
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.
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.
O exame é aplicado no computador, com hora e local definidos pelo candidato, em um centro
Pearson Vue.
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.
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.
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?
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
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.
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.
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.
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.
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:
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
Basta recortar pequenos pedaços de papel (fichas, cartões, postit) e escrever uma pergunta
na frente e uma resposta no verso.
Este item é um complemento do anterior, mas é tão importante que resolvi separá-lo para
que você dê mais atenção a ele.
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.
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.
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
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.
https://t.me/comptialinux
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.
Para solicitar seu desconto acadêmico, por favor preencha o formulário no site:
https://www.certificacaolinux.com.br/descontoacademico
Hardware e Configuração do
Sistema
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.
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,
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
É 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 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.
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.
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.
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.
Por exemplo:
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.
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.
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.
/dev/sda (hd0)
/dev/sda1 (hd0,0)
/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.
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.
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.
Para alterar, incluir ou excluir a carga de algum sistema operacional no Grub 1, basta alterar
o arquivo menu.lst.
initramfs
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
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.
$ 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.
# grub-install /dev/sda
# grub-install --boot-directory=/bootalternativo
O Grub 2 é o gerenciador de boot padrão da maioria das distribuições, desde o Kernel 2.6.
O upgrade do Grub 1 para o Grub 2 é relativamente fácil. Primeiro deve-se instalar o pacote
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:
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
/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:
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”
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 “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
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.
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:
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
GRUB_GFXMODE
GRUB_DISABLE_LINUX_RECOVERY
GRUB_INIT_TUNE
Define um “som” que o grub fará antes de apresentar o menu. O formato é[tom da nota]
[duração].
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.
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.
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
10_hurd
Usado para localizar Kernels Hurd. Não é utilizado na maioria das distribuições.
10_linux
20_memtest86+
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
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.
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.
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 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.
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
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:
Restaurada a saúde da partição de /root, ela pode ser desmontada, e então o sistema
reiniciado normalmente.
Simulado
1.2 Instalar, Configurar e Monitorar
Módulos do Kernel
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.
$ ls -l /lib/modules
total 12
drwxr-xr-x 7 root root 4096 Oct 15 01:56
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.
$ 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
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
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
# modprobe –r 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.
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.
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
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.
/lib/modules/versão_do_kernel.
Exemplo:
$ sudo depmod
$ 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.
$ 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+
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);
Distribuição Localização
OpenSuSE /etc/sysconfig/network
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.
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.
$ 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.
auto eth0
iface eth0 inet static
address 192.168.0.2
netmask 255.255.255.0
gateway 192.168.0.254
auto eth0
iface eth0 inet dhcp
iface eth0 inet6 dhcp
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.
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":
Resolução de Nomes
/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.
/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.
Por exemplo:
$ 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
O DNS – Domain Name System é utilizado para resolução de nomes para endereços IP e vice-
versa.
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.
/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;
search meudominio.com.br
nameserver 10.25.12.1
nameserver 200.216.215.5
Network Manager
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
interface: enp0s5
Para se conectat à uma rede wifi, basta informar o SSID da rede (nome) e a senha do Wifi:
$ nmcli connection
NAME UUID TYPE
DEVICE
Wired connection 1 b7603264-e0c6-30e6-9b06-a626a568f0b7
ethernet enp0s5
Assim, o nmcli trará um console interativo, onde será possível modificar os parâmetros.
Exemplo:
Uma configuração também pode ser alterada diretamente no prompt do shell, com o
comando:
É possível alterar uma infinidade de parâmetros com o nmcli. Veja a lista de parâmetros
possíveis com o comando
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.
Figura 5 - nm-connection-editor
Figura 6 - nmtui
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.
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).
# 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
O comando ip pode ser utilizado para designar um endereço IP ao host, utilizando o objeto
addr, seguido da palavra add:
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:
A mesma ideia pode ser utilizada para apagar um endereço IP de uma determinada interface,
com o objeto addr e o comando del:
Para habilitar uma interface, utilizamos o objeto link, seguido da palavra set, o nome da
interface e o comando up:
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
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:
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.
# 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
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:
As ferramentas ifconfig, route e netstat que fazem parte do pacote legado Net-Tools tem
paralelo na ferramenta ip do iproute2, a seguir:
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
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 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
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.
route
$ route [opções] comando alvo
Tudo que o comando route faz pode ser realizado pelo comando ip.
$ 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
$ 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
Para adicionar uma rota, utiliza-se o parâmetro "add" e para remover uma rota, utiliza-se o
parâmetro "del".
Para adicionar uma nova rota com o comando route, utilizamos o parâmetro add:
Para apagar uma determinada rota, utiliza-se o route seguido do comando del e a
informação da rede que se deseja apagar:
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:
Ferramentas de Diagnóstico
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.
-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 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:
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".
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+
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.
$ 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":
$ 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]
Exemplos:
$ 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
$ 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))
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.
$ host esteendereconaoexiste.com
Host esteendereconaoexiste.com not found: 3(NXDOMAIN)
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+
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.
$ 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:
$ 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
$ 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 registro específico de DNS também pode ser consultado, com a opção "-q=registro":
ethtool
$ ethtool [opções] dispositivo
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+
$ ethtool -S eth0
NIC statistics:
rx_gso_checksum_fixup: 0
Para piscar as luzes da placa de rede (útil para identificar máquinas com mais de uma placa
de rede):
É possível fazer vários ajustes de "sintonia fina" na rede, através de parâmetros do Kernel.
$ 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
$ 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
# 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:
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
# sysctl -p
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:
1 active-backup Provê tolerância a falhas usando uma interface como primária e outra como backup
4 802.3ad Agrega as interfaces para criar uma única conexão combinando a largura de banda
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:
Uma vez definido o modo de operação da ligação, é possível adicionar as interfaces que irão
trabalhar ser ligadas:
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
# sysctl -p
O comando brctl pode usado para configurar, manter e inspecionar a configuração da ponte
rede no kernel Linux.
Simulado
1.4 Gerenciar Armazenamento no Linux
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.
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.
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:
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ê 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.
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.
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.
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
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
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.
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).
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.
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.
# 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
# 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
# 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:
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.
É possível converter um disco que use MBR em GPT, mas isso foge do escopo do exame.
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
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.
Estes conceitos sã o importantes para podermos entender a nomenclatura que os discos tê m
no sistema de arquivos do Linux.
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.
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:
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:
$ 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:
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.
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:
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.
Podemos ter no má ximo 15 partições com sistema de arquivos em um ú nico disco, sendo 3
primá rias e doze ló gicas.
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
Existe ainda outro tipo especial de partição no Linux chamado de partição de swap. Esta
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.
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;
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.
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 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
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 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.
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.
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+
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.
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
Também conhecido como DM-Multipathing, este esquema fornece proteção contra falhas de
entrada-saída (E/S) e balanceamento de carga.
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.
$ 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
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.
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
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
Script
I carrega layout de disco de um arquivo script de sfdisk
O despeja layout de disco para um arquivo script de sfdisk
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:
# 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.
tamanho 8 GiB.
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”.
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.
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".
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.
O parted também permite ver a partição recém criada com o comando print:
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:
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.
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.
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.
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
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.
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.
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.
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:
# mkfs.ext3 /dev/xvdb1
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
# 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
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.
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.
/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.
/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.
/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:
/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/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/spool: mantém dados de processos que mantém filas de arquivos, tais impressão
e saída de email;
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.
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
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.
df
$ df [opções] [diretórios]
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.
$ df /
Sist. Arq. 1K-blocos Usado Disponível Uso% Montado em
/dev/mapper/cl-root 42954248 8079412 34874836 19% /
$ 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% /
$ 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.
Exemplos:
$ du –h /home
2M /home/carla
4M /home/cristiane
5M /home/guilherme
1M /home/michel
$ du –sh /home
12M /home
$ du –Sh /home
1k /home
$ du -sh ./*/
291M ./carlacru/
173M ./freud/
142M ./mario/
181M ./odonto/
273M ./oficina/
$ du -s --inodes ./*/
75 ./desafio/
15 ./funnel/
2 ./musicas/
# 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.
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.
$ 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
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".
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.
# fsck.ext4 /dev/xvdb1
e2fsck 1.42.9 (28-Dec-2013)
/dev/xvdb1: clean, 41436/524288 files, 374905/2096891 blocks
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:
debugfs
# debugfs [opções] [dispositivo]
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:
dumpe2fs
# dumpe2fs [opções] [dispositivo]
Exemplo:
resize2fs
# resize2fs [opções] [dispositivo] [tamanho]
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.
Exemplo:
# e2label /dev/sda1
sistema
xfs_repair
# xfs_repair [opções] dispositivo
-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
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
Se nenhum dispositivo for informado como parâmetro, ele vai operar em todos os
dispositivos xfs montados
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
tune2fs
# tune2fs [opções] dispositivo
O comando tune2fs ajusta vários parâmetros nos sistemas de arquivo ext2, ext3, or ext4.
$ 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
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>
xfs_db> sb
xfs_db> p
magicnum = 0x58465342
blocksize = 4096
core.magic = 0x494e
core.mode = 0100644
core.version = 2
core.format = 2 (extents)
xfs_db> frag -d
actual 0, ideal 0, fragmentation factor 0.00%
xfs_db> frag -f
actual 5, ideal 2, fragmentation factor 60.00%
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:
cdrom CD-ROM
cdrecorder CD writer
zip Zip drive
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.
Os comandos mount e umount são usados para montar e desmontar sistemas de arquivos.
mount
$ mount [opções] {dispositivo} {diretório}
Geralmente deve ser informado como parâmetro um dispositivo a ser montado e o ponto de
montagem.
Notação Descrição
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
nodev proc
iso9660
vfat
Para montar uma partição Windows (vfat) em /dev/sda1 no ponto de montagem /mnt para
somente para leitura:
# mount -o remount,r /
Para montar uma imagem ISO, a opção "-o loop" deve ser usada:
# 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)
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.
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:
Ou
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:
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]
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
$ lsblk -d
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 64G 0 disk
sr0 11:0 1 1024M 0 rom
$ lsblk -f
NAME FSTYPE LABEL UUID
MOUNTPOINT
sda
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.
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"
/etc/fstab
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.
Opção Descrição
suid Habilita que os executáveis tenham bits do suid e sgid e executem como se fosse o
superusuário.
Opção Descrição
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.
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
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.
/ /dev/sda3 6 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:
/ /dev/vg00/root 6 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+
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.
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.
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.
# pvcreate /dev/sdb
Physical volume “/dev/sdb” successfully created
# pvcreate /dev/sdc
Physical volume “/dev/sdc” successfully created
# 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.
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:
Para ATIVAR:
# lvchange -a y /dev/meuvolume/logico1
Para DESATIVAR:
# lvchange -a n /dev/meuvolume/logico1
# mkfs.ext4 /dev/meuvolume/logico1
mke2fs 1.41.14 (22-Dec-2010)
Filesystem label=
OS type: Linux
(…)
Você também pode usar o LVM para aumentar ou diminuir o tamanho de um volume.
# pvcreate /dev/sdd
Atribuí-lo ao grupo:
# umount /dev/meuvolume/logico1
# e2fsck -f /dev/meuvolume/logico1
Finalmente, redimensionamos:
# resize2fs /dev/meuvolume/logico1
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.
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.
Figura 11 - RAID
mdadm
A ferramenta mdadm pode ser utilizada para criar software RAID, nas configurações RAID 0,
Exemplo:
Neste exemplo, o mdadm irá criar o volume /dev/md0, composto de quatro discos (sdb, sdc,
sdd e sde) com o RAID 5.
# 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
( ... )
Simulado
1.5 - Conceitos e tecnologias de
Núvem e Virtualização
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.
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.
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.
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.
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.
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.
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.
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.
Templates de Hypervisor
As máquinas virtuais que são criadas para executar em um Hypervisor devem ser
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.
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.
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:
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:
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.
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.
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
# vi /etc/hostname
Ao clonar uma máquina virtual, pode ser necessário regerar as chaves de SSH manualmente:
# sudo rm /etc/ssh/ssh_host_*
# 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 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.
Amazon AWS
Microsoft Azure
Google Cloud
Rackspace
IBM Cloud
VMWare
Oracle Cloud
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.
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.
Por padrão, cada instância tem um disco permanente de inicialização pequeno que contém o
sistema operacional.
Instâncias e redes
Instâncias e contêineres
É 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.
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.
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.
Os hypervisors podem criar uma ou várias interfaces de rede virtuais, switches de rede,
incorporar firewalls, load balancing e até roteadores.
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.
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).
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.
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.
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.
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.
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:
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.
Simulado
1.6 – Configurar as Opções de
Localização
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
$ 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
( ... )
$ 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
/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:
Neste exemplo, a zona de fuso horário de São Paulo será utilizada pelo sistema.
/etc/timezone
$ 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/:
Variável TZ
A variável TZ também pode ser utilizada para definir a zona de fuso horário do usuário
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.
# 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
Uma vez selecionada a Zona de Fuso Horário desejada, o tzselect pede para confirmar as
configurações:
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.
Veja os exemplos:
$ date
Sat 19 Oct 2019 01:13:02 PM -03
$ date -u
Sat 19 Oct 2019 04:13:45 PM UTC
%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:
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
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')
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
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.
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.
escorregamento da frequência;
Exemplos:
# hwclock -c
hw-time system-time freq-offset-ppm tick
1571594417 1571594417.011423
1571594427 1571594427.012649 123 1
# hwclock -w
timedatectl
$ timedatectl
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
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
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
As variáveis são:
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
$ 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:
$ locale-gen pt_BR.UTF-8
Generating locales (this might take a while)...
pt_BR.UTF-8... done
Generation complete.
$ 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:
$ localectl status
System Locale: LANG=en_US.UTF-8
VC Keymap: n/a
X11 Layout: n/a
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.
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.
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.
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+
UNICODE
Unicode é um padrão que permite aos computadores representar e manipular, de forma
consistente, texto de qualquer sistema de escrita existente.
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.
Operação e Manutenção de
Sistemas
Simulado
2.1 Fazer as instalações,
configurações, atualizações e
remoções de software
Compiladores
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.
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.
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.
#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 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.
COMPILAÇÃO
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
ASSEMBLER
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
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.
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.
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:
$ 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
$ 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
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.
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.
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+
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.
É 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.
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:
Primeiro deve-se escolher o que tar deve fazer através das opções:
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:
$ 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+
Ou
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
No caso dos arquivos compactados com xz, pode-se utilizad o comando xz:
$ xz -d linux.tar.xz
Seguido de:
OU
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
compactador de dados apropriado, juntamente com o tar para extrair o pacote de dados no
diretório corrente.
$ ls -1shS linux*
895M linux.tar
165M linux.tar.gz
126M linux.tar.bz2
105M linux-5.4.3.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.
$ ./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+
$ ./configure
Ele criará um arquivo especial chamado Makefile, que contém as diretivas de compilação do
software.
~/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.
$ make
Desta forma, o make irá ler o Makefile e fazer todo o processo de compilação do software.
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
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
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
programas necessitam das bibliotecas compartilhadas e uma mudança nas versões destes
arquivos também pode afetar o seu funcionamento.
Por exemplo:
libjack-0.80.0.so.0
libvorbis.so.0
libWand.so.6
libjpeg.so.62
libwv2.so.1
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.
$ ls -1 /etc/ld.so.conf.d
bind-export-x86_64.conf
dyninst-x86_64.conf
kernel-4.19.82-30.69.amzn2.x86_64.conf
mariadb-x86_64.conf
$ cat mariadb-x86_64.conf
/usr/lib64/mysql
Desta forma, toda vez que uma biblioteca for instalada, é necessário executar o ldconfig
para atualizar o índex de bibliotecas.
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.
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.
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
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.
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.
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.
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.
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.
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
Exemplos:
# dpkg -i acct_6.3.5-32_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
dpkg-reconfigure
# dpkg-reconfigure [nome do pacote]
Exemplo:
# dpkg-reconfigure debconf
apt-get
# apt-get [opções] [comando] [nome do pacote]
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+
-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.
Exemplos:
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).
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
apt-cache
# apt-cache comando [nome do pacote]
O apt-cache pode ser utilizado para descobrirmos os pacotes que contêm emuladores do
Atari:
Também pode ser utilizado para se saber mais sobre um determinado pacote, como o
emulador Stella:
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
Repositórios no Debian
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.
A primeira palavra "deb" indica que se trata de pacotes binários de software, e a palavra
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.
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.
Adicionando um repositório
Para adicionar um repositório, basta incluir uma linha com a sintaxe abaixo no arquivo
sources.list:
$ apt-get update
184 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+
Ou
$ aptitude update
Ou
$ apt update
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 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.
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.
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
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.
Exemplo:
# rpm –q bash
bash-2.05b-207
Exemplo:
# rpm -V snort-2.0.1-98.i586.rpm
package snort-2.0.1-98.i586.rpm is not installed
Exemplo:
# rpm -K libpcap-0.7.2-37.i586.rpm
libpcap-0.7.2-37.i586.rpm: sha1 md5 gpg OK
Exemplo:
# rpm –i libpcap-0.7.2-37.i586.rpm
Exemplo:
# rpm -U libpcap-0.7.2-37.i586.rpm
Exemplo:
# rpm –e libpcap-0.7.2-37.i586.rpm
# rpm {--initdb|--rebuilddb}
Exemplo:
# rpm --initdb
# rpm {—qpR }
Exemplo:
Exemplo:
Exemplo:
Exemplo:
Exemplo:
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.
# 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
--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.
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]
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.
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.
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.
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.
$ ls -l /etc/yum.repos.d/
-rw-r--r--. 1 root root 1664 Ago 13 2018 CentOS-Base.repo
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
Veja os exemplos:
Resolving Dependencies
Install 2 Package(s)
Is this ok [y/N]: y
-----------------------------------------------------------------
-
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.
# 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+
Name and summary matches only, use “search all” for everything.
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
# 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
(…)
Repo : amzn-main
Resultado a partir de:
Nome de arquivo : /etc/sysconfig/nfs
# 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.
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:
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.
# zypper update
Simulado
2.2 Gerenciando Usuários e Grupos e
Arquivos Relacionados
/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;
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;
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+
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
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.
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.
root:$1odIUdsnsOIUsd83sHi8JhuE:12422:0:99999:7:::
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.
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 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+
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:
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";
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.
root:x:0:root
daemon:x:10:wwwrun,sendmail,squid
users:x:500:uira,carla
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
useradd
# useradd [opções] login
O comando useradd cria contas de usuário no sistema. Seu único parâmetro obrigatório é o
login do usuário.
$ 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.
A senha da conta deverá ser configurada depois de criada a conta o com o comando passwd.
Exemplos:
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.
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
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
Exemplos:
# usermod –L analima
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
A opção disponível é:
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
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.
# passwd uira
Enter new password for ‘uira’:
# passwd -S uira
uira PS 2019-04-11 0 99999 7 -1 (Password set, SHA512 crypt.)
# passwd -l uira
Locking password for user uira.
passwd: Success
# passwd -S uira
uira LK 2019-04-11 0 99999 7 -1 (Password locked.)
# passwd -u uira
Unlocking password for user uira.
passwd: Success
# passwd -S uira
uira PS 2019-04-11 0 99999 7 -1 (Password set, SHA512 crypt.)
# passwd -x 30 uira
Adjusting aging data for user uira.
passwd: Success
# passwd -S uira
uira PS 2019-04-11 0 30 7 -1 (Password set, SHA512 crypt.)
chage
# chage [opções] login
(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.
Exemplo:
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.
groupadd
# groupadd nome_do_grupo
-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:
# groupadd contabilidade
groupdel
# groupdel nome_do_grupo
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
groupmod
# groupmod [opção] nome_do_grupo
-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:
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.
A sintaxe do comando é:
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 -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
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)
id
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.
$ id -un
uiraribeiro
uiraribeiro@ubuntu:~$ id -u
1000
$ 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
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 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.
/etc/profile
/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
~/.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
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,
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.
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.
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”.
No Debian:
# apt update
# apt install quota
No Redhat:
# vi /etc/fstab
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
# touch /home/aquota.user
# touch /home/aquota.group
# chmod 600 /home/aquota.user
# chmod 600 /home/aquota.group
# quotacheck –avug
# ls –lga /home
# 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
# 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.
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
Exemplo:
# 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]
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]
Exemplo:
224 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+
quotacheck
# quotacheck [opções] [dispositivo]
Exemplo:
# quotaoff –a
# quotacheck –aug
# quotaon
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.
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.
Exemplo:
# repquota –va
*** Report for user quotas on /dev/hda6 (/home)
Block limits File limits
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.
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”.
$ 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:
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
Salvar Arquivo :w
Localizar novamente /
Ação Comando
Localizar novamente ?
Desfazer alterações u
Ir para a esquerda h
Ir para a direita l
Ajuda :help
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+
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.
$ 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
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.
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.
As expressões regulares são úteis para buscar ou validar textos variáveis como:
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
Agrupamento
Parênteses ((, )) são usados para definir o escopo e a precedência de operadores, entre
outros usos.
POSIX
De 1986, a norma IEEE POSIX 1003.2 (POSIX.2) padroniza expressões regulares, e fornece
duas especificações, a saber:
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
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.
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.
* 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 +).
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.
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+
Classe Descrição
[:digit:] Dígitos, o que no caso de ASCII corresponde a [0-9]. O Perl oferece o atalho \d.
[: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]
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.
-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 todas as linhas terminadas com a palavra false. O símbolo $ representa o fim de uma
linha:
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:
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”:
Procura por linhas que contenham uma sequência de pelo menos quatro números
consecutivos:
$ grep security *
$ 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:
egrep
$ egrep [opções] expressão-regular arquivos
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.
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:
É 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.
Por este motivo, é mais rápido que o grep, mas menos versátil.
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.
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.
$ cat teste.txt
Observe que neste exemplo o conteúdo do arquivo texto.txt é substituído pelo texto1.txt.
$ 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.
-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
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
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.
$ more README
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.
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.
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.
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
( ... )
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
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
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:
Qualquer comando pode ter a sua saída redirecionada para um arquivo, ou para um
dispositivo utilizando um descritor de arquivos que o representa.
$ ls > saida.txt
Para enviar toda a saída do programa folha_pagamento para o arquivo1, inclusive com os
erros:
É possível filtrar somente a saída padrão do programa folha_pagamento para arquivo1, SEM
os erros, usando somente o descritor "1":
Se quisermos enviar toda a saída de erros para o arquivo arquivo_ erro.log, podemos usar o
descritor "2":
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) :
Outra possibilidade é enviar somente a saída de erros para o limbo usando a abstração de
/dev/null:
O mesmo pode ser feito para enviar os erros para a impressora, usando a abstração que
representa impressoras no /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.
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:
É 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:
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.
$ 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:
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:
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:
A opção "-t" do xargs é interessante, pois ele escreve o comando que irá executar:
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.
A opção é:
-a: Adiciona no final do arquivo o que foi recebido ao invés de gravar por cima.
Exemplo:
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.
Veja o exemplo com a lista de supermercado, onde o tr é usado para trocar todas as letras
minúsculas para maiúsculas:
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.
$ NOME="Uirá"
$ echo "Bom dia $NOME"
Bom dia Uirá
sort
$ sort [opções] arquivo
$ 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
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.
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 listar somente os logins dos usuários no arquivo /etc/passwd, pode-se usar a opção "-F",
indicando o delimitador:
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.
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.
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:
Para troca o nome uira pelo nome carla no arquivo /etc/passwd e imprimir na saída padrão:
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
comprar batata
comprar alface
comprar tomate
comprar arroz
O comando "d" pode ser usado para apagar todas as linhas que contém a palavra carne e
cria uma cópia:
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>/
cut
$ cut [opções] arquivo
-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 –b 1 /etc/passwd
O comando cut funciona exatamente como o comando awk. O exemplo a seguir produz o
mesmo resultado do comando anterior:
printf
$ printf FORMATO ARGUMENTO
Exemplo:
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.
Neste exemplo, vamos usar o wc para contar os itens únicos da lista de supermercado:
Nossa lista tem 6 itens (um por linha), seis palavras e 41 caracteres.
paste
$ paste [opções] arquivo1 arquivo2
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:
Neste caso, como você tem um arquivo com 8 nomes, você precisa criar um arquivo com 8
linhas com "empresa.com":
$ 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:
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
existir.
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:
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 :
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:
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.
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.
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
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
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.
Exemplos:
$ cp arquivo1 arquivo2
$ 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":
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.
Exemplos:
$ mv arquivo1 arquivo2
$ 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
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:
Exemplos:
Remove o arquivo1:
$ rm arquivo1
$ rm –Rf documentos
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.
-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:
$ 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
rmdir
$ rmdir [opções] diretório
Exemplos:
$ rmdir favoritos
$ rmdir -p a/b/c/d
$ rmdir musicas
rmdir: falhou em remover “musicas”: Directory not empty
unlink
$ unlink arquivo
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.
O comando unlink também pode ser usado para desfazer um link criado com o comando "ln".
Exemplo:
$ unlink arquivo
diff
$ diff arquivos
O comando diff é útil para comparar versões de arquivos, mostrando quais são as diferenças.
$ cat lista
abacate
arroz
feijão
carne
picanha
tomate
$ cat lista2
abacate
arroz
feijoada
carne
picanha
tomate
Localizando Arquivos
Os comandos find, locate, updatedb, which e whereis podem ser utilizado para encontrar
arquivos no disco.
find
$ 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):
Procura por todos os arquivos com extensão .txt a partir do diretório corrente (.):
Procura pelo diretório “usuarios” a partir do diretório corrente, independente se está escrito
com letras maiúsculas ou minúsculas:
Procura por arquivos que não terminam com .html a partir do diretório corrente:
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:
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.
$ locate passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/usr/bin/gpasswd
( ... )
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.
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.
Exemplo:
$ whereis ifconfig
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
which
$ which comando
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
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.
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.
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.
ln
$ ln [opções] arquivo link
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:
$ 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.
$ 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
$ 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.
O Linux também permite a cópia de arquivos remotos através dos comandos scp e rsync.
scp
$ scp origem destino
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.
Exemplos:
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:
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.
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.
$ 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]
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.
# init 5
ou
# telinit 6
É importante saber que a troca de nível de execução pode alterar os processos em execução
e até desligar o sistema.
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:
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.
Link simbólicos funcionam como os Atalhos do Windows: eles simplesmente apontam para os
arquivos "verdadeiros".
[K|S]nn[nomedoscript]
Onde:
Por exemplo:
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
chkconfig
# chkconfig [opções]
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
service
# service script comando
Para iniciar ou parar um serviço de forma elegante no System V, devemos usar o comando
service.
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.
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:
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.
O comando runlevel não altera o nível de execução, mas somente informa. Para alterar
utilize o comando init ou telinit
Objetivo Comando
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]
# shutdown –r now
Para reiniciar o sistema as 06h da manhã e enviar mensagem no terminal dos usuários:
Control-Alt-Del
A linha "ca" no arquivo /etc/inittab trata o que acontece quando pressionamos a sequencia
control+alt+del:
E antes de tomar qualquer ação de manutenção ou reinicio do sistema, ainda mais quando se
Embora o System V init Daemon seja um sistema robusto e utilizado no Kernel 2.4, ele tem
desvantagens, tais como:
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.
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.
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.
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:
arquivos .ini do Windows. Estes arquivos são encontrados em dois diretórios, a saber:
Rescue.target
O modo de resgate ou recuperação pode ser usando para uma manutenção do sistema mais
"leve". Neste modo o sistema:
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:
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]
Comando Ação
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
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
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":
Ou
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 mudar o runlevel para o modo texto (runlevel 3), usa-se o comando isolate
Para ver qual o runlevel que está em execução, pode-se usar o comando get-default:
$ systemctl get-default
graphical.target
# rm /etc/systemd/system/default.target
# 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:
Para ver quais units um determinado serviço é dependente, pode-se usar o comando list-
dependencies:
● ├─dev-mqueue.mount
● ├─keyboard-setup.service
● ├─kmod-static-nodes.service
( ... )
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:
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:
Para voltar o serviço, o comando unmask pode executado, retornando a unidade do exílio:
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.
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.
Desta forma, é importante que você tenha noção que o systemd também é capaz de montar
discos e partições de swap.
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
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.
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).
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:
$ 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+
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".
systemd-analyze
$ systemd-analyze
O comando systemd-analyze pode ser utilizado para dizer quanto tempo o sistema demorou
para dar carga.
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.
É 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
( ... )
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).
Simulado
2.5 Linux como Servidor
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.
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.
$ 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
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.
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.
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.
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+
$ cat /etc/services
tcpmux 1/tcp
echo 7/tcp
echo 7/udp
discard 9/tcp
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.
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
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).
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.
No Linux, os pacotes Chrony ou NTPD geralmente são utilizados como serviço de NTP.
É 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.
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.
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.
No entanto, o Linux pode ser utilizado para autenticar usuários para uma rede local,
utilizando os servidores de SAMBA, KEBEROS e LDAP:
Keberos
SAMBA
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.
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.
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.
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.
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
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.
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.
Não é necessário reiniciar o serviço do cron porque ele verifica seus arquivos a cada minuto.
Dia da Semana: Valor entre 0 e 7, sendo que zero ou sete são usados para identificar o
domingo.
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.
0 10 * * * root sync
0 6 * * 1 root updatedb
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/
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:
Veja os exemplos:
$ 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.
O cron também conta com um diretório especial em /etc/cron.d. Este diretório pode conter os
arquivos:
# cat /etc/cron.d/sysstat
*/10 * * * * root /usr/lib64/sa/sa1 1 1
53 23 * * * root /usr/lib64/sa/sa2 -A
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
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.
$ cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf
exit 0
at
$ at
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.
Veja os exemplos:
# at -f comandos.txt teatime
# at -f comandos.txt +3 minutes
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.
# 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:
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:
$ 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
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.
É 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.
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.
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.
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.
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
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:
$ 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
( ... )
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.
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.
$ ls
&
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:
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:
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]
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:
$ 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.
fg
$ fg [número da tarefa]
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:
$ 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.
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+
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]
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:
O nohup executa o comando especificado, mas não permite que ele receba nenhuma entrada
de dados pelo terminal.
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.
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.
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.
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.
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
FIRMWARE
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
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
É 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
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.
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.
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
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:
É 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.
Configurações de Hardware
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.
É importante saber que estes recursos são limitados e precisam ser gerenciados para que
conflitos entre os dispositivos sejam evitados.
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.
$ 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
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
Cada dispositivo possui um endereço de porta única que não podem ser compartilhados
entre outros dispositivos.
$ cat /proc/ioports
0000-001f : dma1
0020-003f : pic1
0040-005f : timer
0060-006f : keyboard
0070-007f : rtc
(...)
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.
$ 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:
/dev/sda1 C: 0x1F0 - 14
Dispositivos de Armazenamento
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.
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.
$ 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
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]
O lspci é útil para mostrar todas as informações sobre os barramentos PCI do sistema e os
dispositivos conectados a eles.
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 /
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.
$ 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
$ 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:
# 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:
lsdev
$ lsdev
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
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.
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.
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.
# 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
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
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.
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
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.
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
Exemplo:
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.
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.
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:
Uma vez iniciado o servidor CUPS, ele pode ser acessado através de um navegador na porta
631 do host em questão:
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.
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.
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.
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.
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: Dispositivo onde a impressora está conectada. /dev/lp0 ou /dev/lp1 para portas
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.
Exemplo:
$ lp LEIAME.TXT
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.
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]
A opção possível é:
Exemplo:
$ lprm -
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
Exemplos:
$ lpc status
lp:
queuing is enabled
printing is enabled
4 entries in spool area
lp is ready and printing
# lpc disable lp
lp:
queuing disabled
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).
Cada tipo de trabalho será tratado de forma diferente para que possa ser transformado
corretamente e impresso.
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.
Exemplos:
$ lpr documento.txt
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.
winprn:\
:if=/usr/bin/smbprint:\
:sd=/var/spool/lpd/winlpd:
# cat /var/spool/lpd/winlpd/.config
server=Jupiter
service=Impressora
password=”1324”
Onde:
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.
Figura 21 - Arquitetura do X
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.
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.
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.
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.
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.
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.
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:
# yum grouplist
Ambiente de trabalho Cinnamon
Ambiente de trabalho MATE
KDE Desktop.
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:
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/.
/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.
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
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
$ 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
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
$ xhost +notebook2.certificacaolinux.com.br
$ 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
$ export DISPLAY=notebook1.certificacaolinux.com.br:0.0
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.
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
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.
Hostname:D.S
Onde:
S: é o número da tela. Um monitor pode ter várias telas. Geralmente só há uma e o valor é
geralmente zero.
xauth
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
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:~$
Agora, é possível executar um shell como novo usuário com o comando "sudo su oracle -":
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:
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:
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.
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 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.
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
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.
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 gerenciador de janelas KWin é responsável por fornecer uma interface gráfica organizada e
consistente, e barra de tarefas intuitiva.
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 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 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”.
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.
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.
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.
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.
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+
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.
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.
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 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.
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.
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.
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.
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.
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 recursos ainda são possíveis quando se trata de acessibilidade, tais como:
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+
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:
Na prova você deve ser capaz de associar o recurso de acessibilidade ao benefício que ele
propõe aos usuários.
Segurança
Simulado
3.1 Aplique as permissões de Usuário
e Propriedade
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:
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.
Figura 39 - ls
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.
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:
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;
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.
Esta representação pode ser utilizada para cada classe (Dono, Grupo e Outros), bem como
para os bits especiais (SUID, SGID, Sticky).
Exemplo:
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:
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.
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:
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.
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-----).
$ umask 027
$ umask
0027
$ touch arquivo
$ ls -l arquivo
-rw-r-----. 1 uira uira 0 Set 18 10:50 arquivo
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.
chmod
$ chmod [opções] { letras, octal } arquivo
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
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
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
mesma hierarquia.
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.
$ chmod +x Backup.sh
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):
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:
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.
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.
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.
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:
Altera o dono do arquivo Leiame.txt para o usuário uira e o grupo do arquivo para o grupo do
usuário:
Altera o dono do arquivo Leiame.txt para o usuário uira e o grupo para users:
Altera o dono de todos os arquivos e diretórios dentro de /home/uira para o usuário 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
Exemplo:
Altera recursivamente o grupo de todos os arquivos e diretórios dentro de /home para users.
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:
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.
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:
$ 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:
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:
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-
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.
$ 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 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.
Exemplo:
Se o UID do usuário for omitido, o setfacl criará uma regra para o proprietário do arquivo:
Para criar uma regra de grupo, utiliza-se a letra "g" ou "group", seguido do GUID:
ou
Para criar uma regra para Outros, não é necessário declarar o UID e GUID. A letra será o "o"
seguindo das permissões:
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.
$ getfacl teste
# file: teste/
# owner: uiraribeiro
# group: uiraribeiro
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--
$ 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:
$ cat acls.txt
u:uiraribeiro:rw
u:arthur:r
u:carla:rw
Para excluir uma regra específica, deve-se usar a opção "-x" do setfacl, especificando qual é
a regra a ser excluída:
$ 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:
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+
$ 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.
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 SELinux foi incorporado nas distribuições baseadas em RedHat, tais como o Fedora e
CentOS, e instalada opcionalmente em sistemas baseados no Debian.
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.
$ cat /etc/selinux/config
SELINUX=disabled
SELINUXTYPE=targeted
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:
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 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.
getenforce
$ getenforce
Enforcing
sestatus
$ 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.
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.
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.
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.
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.
# semodule -l
abrt
accountsd
acct
afs
aiccu
aide
ajaxterm
Interruptores
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:
$ 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.
$ ls -Z arquivo
unconfined_u:object_r:user_home_t:s0 arquivo
Neste exemplo, as portas 80, 81, 443, 488, 8008, 8009, 8443, 9000 estão habilitadas para o
servidores web.
Exemplo:
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.
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:
AppArmor
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:
O AppArmor também define os acessos aos arquivos e portas do sistema através de políticas,
que são nomeadas de profiles.
$ 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.
Cada profile é um arquivo texto que define quais arquivos e portas uma determinada
aplicação pode acessar.
É 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
# /etc/init.d/apparmor stop
Os perfis no modo complain não aplicarão a política, mas somente relatarão tentativas de
violação.
aa-status
$ 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
( ... )
/usr/sbin/dnsmasq
/usr/sbin/dnsmasq//libvirt_leaseshelper
avahi-daemon
( ... )
aa-complain
# aa-complain /usr/sbin/cupsd
Setting /usr/sbin/cupsd to complain mode.
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
# 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
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.
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.
$ ulimit -s 512
$ 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
$ ulimit -n 12
A opção –m pode limitar o máximo de memória que pode ser utilizada em kbytes:
$ ulimit –m 2000
$ 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
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.
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 -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
chage
# chage [opções] login
(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.
Exemplo:
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+
As informações de expiração da conta podem ser visualizadas com a opção "-l" do comando.
SUID e SGID
Os programas são geralmente sempre executados em nome e com as permissões dos
usuários que os executou.
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”:
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.
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 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 AMBOS os bits SUID e SUIG habilitados, soma-se as
permissões (4000+2000):
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:
Pode-se refinar a busca, excluindo os erros, enviando a saída de erros para /dev/null:
Se quiser refinar mais ainda, listando as permissões, pode-se combinar o comando "ls" com a
opção "-exec":
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.
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
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:
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:
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:
# 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]
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 -
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”.
$ su 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.
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:
Feito isso, qualquer usuário que faça parte do grupo gruposudoedit poderá editar o arquivo
com o comando sudoedit:
$ sudoedit /diretorio/arquivo
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:
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.
Simulado
3.2 Configurar e Implementar o Acesso
e Métodos de Autenticação
PAM
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.
$ 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.
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.
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:
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.
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.
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.
Você não precisa saber construir um arquivo de configuração para o exame, mas é
necessário conhecer alguns detalhes do funcionamento do PAM.
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:
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.
No Ubuntu e Debian:
$ cat /etc/pam.d/common-auth
auth required pam_tally2.so deny=2 silent
auth [success=1 default=ignore] pam_unix.so
nullok_secure
# 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.
$ 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:
$ 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
( ... )
$ faillock
uiraribeiro:
When Type Source Valid
2019-12-28 16:31:33 RHOST 10.211.55.2 V
É 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.
$ 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*).
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.
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.
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.
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.
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.
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
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.
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).
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 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.
É possível que uma pessoa, empresa ou entidade auto-assine e emita o seu próprio
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
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.
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.
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.
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.
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:
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.
".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 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
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.
$ 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.
O ssh permite especificar uma porta de conexão, quando a porta 22 não é a porta padrão do
servidor remoto:
ssh_know_hosts
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.
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:
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
Na prova você não será cobrado em saber alterar as opções, mas as seguintes informações
são relevantes:
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
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:
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:
# ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-lqMuRR398/agent.398; export SSH_AUTH_SOCK;
SSH_AGENT_PID=399; export SSH_AGENT_PID;
# 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
sua máquina esteja vulnerável, todas as máquinas em que você usa regularmente o acesso
ssh via chaves também estará comprometido.
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
PermitRootLogin no
Uso de Tcpwrapper
Uma técnica antiga no Linux para limitar o acesso a um determinado serviço é o uso do
tcpwrapper.
Para determinar se um programa faz uso do tcpwrapper, pode-se consultar quais bibliotecas
ele utiliza com o programa ldd:
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
nome_do_serviço: endereço_ip
Há uma lógica e uma ordem estabelecida, que você precisa memorizar para o exame:
$ cat /etc/hosts.allow
sshd: 10.10.100.1
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: uira.certificacaolinux.com.br
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.
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
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.
Depois de instalado, para ser executado, basta invocar o openvpn com o arquivo de
configuração da vpn:
# 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.
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.
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.
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.
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.
$ grub-mkpasswd-pbkdf2
Enter password:
Reenter password:
PBKDF2 hash of your password is
grub.pbkdf2.sha512.10000.BB8BE770789F1231191A0B531629DAC79D222355
D1C23D6BC1B8B387FF8AB8316C2E49D15D14CB8EFB5CB72BAB2A898F12F8C133D
BD598EC960C92FB9187D492.DE41025B0CA1FCA923AA85279D53DBEBF4E5DC7E6
85D0E7BE162FC95EEAE0CE0B3C0BAA2041F790106AB9AC991769AE75CCE23896C
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.
# update-grub2
# 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
# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
done
Desabilitar o Ctrl-Alt-Del
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":
Nas distribuições que usam o Systemd, pode-se mascarar o target de Ctrl-Alt-Del com o
comando systemctl mask:
Desta forma, o módulo usb_storage não será carregado pelo kernel quando um dispositivo
usb de armazenamento foi plugado na máquina.
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.
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.
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).
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.
LDAP
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.
No Linux também é possível criar uma solução bem parecida com os pacotes openldap e
krb5.
RADIUS
TACACS+
Tem pelo menos 20 anos que não trabalho com nenhum destes dois protocolos.
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
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.
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:
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.
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".
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:
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.
Se o arquivo /etc/securetty estiver vazio (mas precisa existir), o usuário root será impedido
de logar até mesmo via console.
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.
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.
$ systemctl status
Pode-se ainda listar as portas abertas e os seus respectivos processos com os comandos
netstat ou ss:
# netstat -tunlp
ou
# ss -tunlp
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
E para desabilitar:
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.
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).
/etc/xinetd.conf
/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
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
}
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.
hosts.allow e hosts.deny
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.
$ cat /etc/hosts.allow
telnet: 10.10.100.1
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.
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é
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.
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:
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 RedHat/CentOS/Fedora:
Para criptografar é necessário que o disco ou partição esteja vazio. O comando cryptsetup
prepara o disco para criptografia:
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:
$ ls -l /dev/mapper/dados
lrwxrwxrwx 1 root root 7 Dec 30 12:55 /dev/mapper/dados ->
../dm-0
# 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,
1605632
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
Agora é só utilizar o disco normalmente. Após reinício é necessário abrir novamente o disco
com o cryptosetup:
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.
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:
O Luks vai solicitar a senha para adicionar a chave. Uma vez adicionada, ela pode ser
utilizada num arquivo especial chamado /etc/crypttab.
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:
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.
# apt-get dist-upgrade
# 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
# dnf update
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).
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:
Ou no CentOS/Fedora/RedHat:
Uma vez instalado, ele pode ser habilitado usando o comando systemctl:
Destaco que auditoria consome recursos da máquina, tanto disco, CPU e memória. Deve ser
aplicada com propósito e cautela.
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 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.
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.
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
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 “;”.
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.
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 “-”:
Os caracteres especiais “=” e “!” podem ser combinados em uma mesma regra.
kern.warning;*.err;authpriv.none /dev/tty10
kern.warning;*.err;authpriv.none |/dev/xconsole
*.emerg *
*.alert root
mail.* -/var/log/mail
mail.info -/var/log/mail.info
mail.warning -/var/log/mail.warn
mail.err /var/log/mail.err
*.=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.
Arquivo Propósito
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.
-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;
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:
# 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.
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.
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
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.
$ 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
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.
$ cat /etc/logrotate.d/chrony
/var/log/chrony/*.log {
postrotate
/usr/bin/chronyc cyclelogs > /dev/null 2>&1 || true
endscript
}
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.
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.
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
ou
$ journalctl –u nginx.service
$ journalctl /bin/bash
$ journalctl –n
$ journalctl –f
$ 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).
$ 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.
$ 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":
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 "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.
O padrão é "auto".
Tamanho
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.
# 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).
# 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.
# journalctl --vacuum-files=5
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:
Observe que a saída do comando "cat /etc/machine-id" é fornecida como caminho para o
Journal.
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.
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:
A maioria dos Firewalls trabalham no modelo de Controle de Acesso, atuando nas camadas
de Transporte (TCP/UDP) e Internet (IP/ICMP).
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.
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.
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):
Ação Descrição
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.
Na tabela de FILTER, o firewall trabalha com três fluxos de dados. Os fluxos são chamados
de Chain:
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.
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.
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.
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.
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.
-P chain política Especifica qual será a política de uma chain: ACCEPT ou DROP.
-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.
Opção Descrição
-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).
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)
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.
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:
# sysctl -w net.ipv4.ip_forward=1
# sysctl -w net.ipv6.conf.all.forwarding=1
E no arquivio /etc/sysctl.conf:
Para liberar a entrada de conexões SSH do rede local, cria-se duas regras:
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:
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".
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:
Opcionalmente, pode-se liberar os pacotes ICMP para liberar o PING. Novamente, usou-se a
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:
É 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):
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:
Qualquer outro pacote que não se enquadre nestas regras será descartado (Política DROP).
-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 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
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:
Para restaurar as regras salvas com o iptables-save, pode-se usar comandos iptables-
restore:
Para que as regras de Firewall sejam carregadas no momento do boot, é preciso coloca-las
em arquivos apropriados.
É 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.
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.
Os arquivos de configuração das zonas são escritos em Extensible Markup Language (XML).
$ firewall-cmd --get-zones
block dmz drop external home internal public trusted work
$ firewall-cmd --get-default-zone
public
# firewall-cmd --set-default-zone=dmz
success
$ 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.
$ 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":
Neste exemplo a zona public está com os serviços dhcpv6-client e ssh habilitados.
O firewalld também tem um botão de pânico para desabilitar todo o tráfego de rede:
# firewall-cmd --panic-on
# 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".
Figura 46 - firewall-config
480 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+
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
# ufw disable
# ufw reset
Para liberar uma determinada porta, utiliza-se a opção "allow" seguido do número da porta
/ protocolo:
Rule added
# 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)
# 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:
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
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.
E no Redhat/CentOS/Fedora:
Uma vez instalado, pode-se criar uma lista que agrupe um conjunto de endereços, portas,
etc.
É 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.
Number of entries: 2
Members:
108.223.43.0/24
200.251.155.0/24
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:
# cat /etc/ipset.conf
create banidos hash:net family inet hashsize 1024 maxelem 65536
add banidos 108.223.43.0/24
Regras Dinâmicas
Fail2ban
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.
Ou
DenyHosts
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:
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.
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.
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:
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.
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:
Tenha em mente que a eficiência de um backup não está na cópia dos arquivos, mas sim na
restauração.
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.
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.
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.
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.
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:
Para fazer um backup incremental, deve-se usar a opção "-g" do tar para fazer o backup
completo, criando um arquivo de controle.
$ 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
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.
No exemplo abaixo o comando copia todos os arquivos de um diretório para uma fita em
/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.
$ dd if=/dev/sr0 of=/tmp/disco1.img
$ 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.
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.
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:
Para restaurar:
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:
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.
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.
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:
O scp pode ser usado para fazer cópias entre duas máquinas remotas:
sftp
sftp [opções] origem destino
Ele faz cópias através de um túnel seguro ssh, e permite um shell interativo, assim como o
antigo ftp.
$ sftp uiraribeiro@servidor
Connected to servidor
sftp>
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+
Verificando a Integridade
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.
$ 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.
$ 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.
$ 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.
Diagnóstico e Resolução de
Problemas do Linux
Simulado
4.1 Analise as Propriedades do
Sistema e Corrija como corresponder
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):
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,
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.
(2^n)-2
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;
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.
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.
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.
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:
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.
Então 256 – 224 = 32. Para saber o número de IPs disponíveis, você subtrai do resultado -2.
Esta rede tem então 32 - 2 = 30 Ips válidos. O intervalo será de 192.168.16.1 até
192.168.16.30.
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.
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:
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.
Pelo menos uma questão da prova envolve fazer estes cálculos. Então, para ganhar tempo,
sugiro você “decorar” as máscaras abaixo:
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.
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
$ ss -ltu
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.
$ ss -lx
É 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.
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:
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.
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.
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.
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:
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.
Cada serviço de rede oferecido por um computador deve utilizar uma porta de comunicação
exclusiva.
O arquivo /etc/services define os serviços e as portas conhecidas pelo sistema Linux. Veja as
portas cobradas no exame:
Porta Uso
22 SSH
23 Telnet
25 SMTP
53 DNS
80 HTTP
110 POP3
123 NTP
139 NetBIOS
143 IMAP
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
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
IPv4, numa situação tecnicamente chamada de “pilha dupla” por algum tempo. A longo
prazo, o IPv6 tem como objetivo substituir o IPv4.
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
3ffe:6a88:85a3::7344
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.
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.
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.
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+
$ 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
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
O moderno comando "ip" é capaz de trazer dois novos elementos estatísticos de problemas
de 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
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
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:
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).
$ cat /etc/resolv.conf
nameserver 127.0.0.53
search localdomain
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":
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
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.
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
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:
Se houver algum problema com a resolução de nomes, a conexão sofrerá com um tempo
esgotado.
$ 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:
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:
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:
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.
Desta forma, pode-se testar se o host é capaz de resolver nomes com um servidor de DNS
público externo:
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.
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.
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+
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
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 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.
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.
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).
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:
# ss -tunelp
Netid Local Address:Port Peer Address:Port
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.
$ 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
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:
$ 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:
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 ]
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.
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:
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:
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
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.
$ iftop
Figura 50 - Iftop
arp
$ arp
O comando arp manipula o cachê de ARP do sistema, para criar ou apagar um registro.
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:
$ arp -n
Address HWaddress
172.30.0.2 0a:55:14:8d:83:82
172.30.0.1 0a:55:14:8d:83:82
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.
$ 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 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.
Figura 51 - mtr
whois
$ whois endereço
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
Análise de 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.
Figura 52 - Wireshark
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:
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:
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+
Ele também permite a captura do tráfedo em uma deteminada porta, com a opção "port":
A opção "-w" permite salvar o dump de rede no formato pcap, que pode ser lido pelo
Wireshark:
Monitoramento e Configuração de
Armazenamento
df
$ df [opções] [diretórios]
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.
$ df /
Sist. Arq. 1K-blocos Usado Disponível Uso% Montado em
/dev/mapper/cl-root 42954248 8079412 34874836 19% /
$ df -i /
536 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+
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% /
$ 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.
Exemplos:
$ du –h /home
2M /home/carla
4M /home/cristiane
5M /home/guilherme
1M /home/michel
$ du –sh /home
12M /home
$ du –Sh /home
1k /home
$ du -sh ./*/
291M ./carlacru/
173M ./freud/
142M ./mario/
181M ./odonto/
273M ./oficina/
$ du -s --inodes ./*/
75 ./desafio/
15 ./funnel/
2 ./musicas/
# 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.
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:
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.
$ iostat -y 10 3
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:
Exemplo de uso:
$ 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).
# 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
É 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.
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.
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).
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]
Neste exemplo, o escalonador utilizado no disco sda é o cfq, selecionado pelas chaves [ ].
CFQ
O algoritmo Complete Fairness Queueing (CFQ) cria uma fila de entrada/saída de dados
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.
Para se alterar o escalonador para CFQ em tempo real, pode-se mudar o valor no arquivo
correspondente ao disco:
DEADLINE
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.
Para se alterar o escalonador para Deadline em tempo real, pode-se mudar o valor no
arquivo correspondente ao disco:
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:
Para que as alterações fiquem permanentes após o reinício do sistema, é necessário alterar a
configuração no GRUB.
GRUB_CMDLINE_LINUX="elevator=deadline"
# update-grub2
Generating grub configuration file ...
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
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
O primeiro passo para monitorar e configurar a CPU é consultar o arquivo /proc/cpuinfo, que
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:
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 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.
$ uptime
20:35:37 up 31 days, 9:41, 1 user, load average: 0,02, 0,02,
0,00
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
sysstat
$ sysstat
O pacote precisa ser instalado usando o gerenciador de pacotes YUM ou APT, dependendo da
distribuição:
Para Ubuntu/Debian:
Para Redhat/CentOS/Fedora:
ENABLED="true"
$ 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
$ 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
$ cat /proc/meminfo
MemTotal: 1003396 kB
MemFree: 71240 kB
MemAvailable: 159292 kB
Buffers: 14144 kB
Cached: 192328 kB
SwapCached: 19964 kB
( ... )
free
$ free [opções]
$ free
total used free shared buff/cache available
Mem: 2039524 189396 178424 131684 1671704 1503316
Swap: 0 0 0
$ free -h
total used free shared buff/cache available
Mem: 1,9G 153M 205M 128M 1,6G 1,5G
Swap: 0B 0B 0B
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 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.
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.
$ 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
# 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.
O objetivo é eliminar o menor número de processos para sair do estado crítico de memória.
O comando sysctl também pode ser usado para alterar os parâmetros do Kernel na hora.
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".
$ sysctl vm.panic_on_oom=1
Para manter essa configuração permanente, pode-se alterar incluir no diretório /etc/sysctl.d:
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
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
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;
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
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";
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.
O que é um processo?
Quando um programa está em execução, ele é chamado de processo.
variáveis de um processo pai. Mas um processo pai não consegue acessar as variáveis
criadas ou alteradas por seus filhos.
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.
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.
ps
$ ps [opções]
O comando ps gera uma lista com todos os processos em execução e os seus atributos.
$ ps
PID TTY TIME CMD
1415 pts/0 00:00:00 ps
30019 pts/0 00:00:00 bash
$ 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
$ ps -a
PID TTY TIME CMD
1675 pts/0 00:00:00 ps
$ 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
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.
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:
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
Terminal (TTY)
Cada processo pode ou não ter um Terminal associado.
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
pgrep
$ pgrep [expressão]
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.
$ pgrep nginx
27991
27993
27994
$ 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:
top
$ top [opções]
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.
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),
É 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 terceira linha o top mostra a quantidade total de memória, memória livre, usada e em
buffer/cache.
pkill
$ pkill [-sinal ] PID
O comando pkill envia sinais para os processos. Ele trabalha da mesma forma que o pgrep.
# pkill -1 nginx
Ou
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.
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.
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.
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.
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.
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:
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.
$ 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.
É 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).
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
( ... )
30018 0 sshd
30019 0 bash
O comando top também pode ser usado para ver a prioridade dos procesoss, na coluna NI:
renice
$ renice [+/-] ajuste_prioridade [opções] PID/Usuário
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).
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.
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.
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
$ 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:
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.
$ 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);
Permissões de Diretório
As permissões de diretório, funcionam um pouco diferente:
Permissão Descrição
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".
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/
$ ls teste/
arquivo arquivo2 sub
$ cd teste/
-bash: cd: teste/: Permission denied
$ cat teste/arquivo
cat: teste/arquivo: Permission denied
$ 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:
$ touch teste/arquivo2
$ touch teste/arquivo3
touch: cannot touch 'teste/arquivo3': Permission denied
$ mv teste/arquivo2 teste/arquivo_antigo
mv: cannot move 'teste/arquivo2' to 'teste/arquivo_antigo':
Permission denied
$ 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.
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:
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:
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.
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:
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:
$ ls /home/arthur
Deve-se ainda verificar se o usuário tem uma senha configurada com o comando getent na
base shadow:
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
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
# 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 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.
$ 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+
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.
# 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:
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
# 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)
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.
# 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:
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:
Acesso Remoto
Se o problema está no acesso remoto, há várias configurações que podem ser verificadas:
Tcpwrapper
Netfilter
sshd_config
Da mesma forma, as diretivas DenyUsers e DenyGroups podem ser usadas para banir
certos usuários ou grupos de logar no sistema.
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.
~/.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.
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
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.
$ 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
$ 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:
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
Simulado
4.4 Analizar e Solucionar Problemas
de Aplicativos e Hardware
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.
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.
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.
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
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
$ df -h
$ df -ih
# 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.
# 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:
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.
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+
Discos SATA
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.
O módulo "ahci" do Kernel é responsável por carregar o suporte aos discos SATA, que são
tratados como discos SCSI pelo Linux.
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:
O sinal precisa ser três traços separados por espaço, que força o sistema a habilitar o disco
SATA.
RAID
$ 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.
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.
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:
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.
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.
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;
Para determinar o usuário que ele executa, utiliza-se o comando "ps aux":
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.
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;
Desta forma, mantem-se as permissões dos arquivos, mas altera-se a sua propriedade:
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.
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.
Versão
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".
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.
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).
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 time zone podem também impactar na hora local que a aplicação irá receber
do sistema.
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
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 Fedora:
No Debian e Ubuntu:
# apt-get clean
No OpenSuSE:
# zypper clean -a
No Ubuntu/Debian: /etc/apt/sources.list
No Red Hat/CentOS/Fedora: /etc/yum.repos.d
No OpenSuSE: /etc/zypp/repos.d
Comando Descrição
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.
# 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
Memoria
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.
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.
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.
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
$ localectl list-keymaps
ANSI-dvorak
al-plisi
( ... )
Uma vez escolhido o mapa de teclado, ele pode ser habilitado com a opção set-keymap:
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.
Automação e Script
Simulado
5.1 Implemente e Execute Scripts Bash
Básicos
PATH
Mantém uma lista de diretórios que o shell procura pelos programas quando executados na
linha de comando;
HOME
USER
TERM
Neste exemplo utilizamos o comando set junto com o comando grep para ver o conteúdo da
variável PATH:
Neste outro exemplo o conteúdo da variável HOME pode ser visto com o comando echo:
$ echo $HOME
/home/uiraribeiro
$ echo $TERM
xterm-256color
$ 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á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”
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
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
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.
Assim o processo filho (o programa que desejamos executar) vai herdar do processo pai (o
shell) as variáveis criadas.
$ BOOK=”Certificação Linux”
$ echo $BOOK
Certificação Linux
$ 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.
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:.
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
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"
$ 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.
#!/bin/bash
echo “Meu nome é $NOME”
$ 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 é
$ export NOME
$ ./meunome.sh
Meu nome é Uirá Ribeiro
O comando export possibilitou que a variável NOME ficasse disponível para todos os
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.
$ 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.
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:
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 é:
set
$ set [variável]
O comando set informa uma lista de todas as variáveis locais, variáveis ambientais e funções
do shell.
-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:
$ 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+
$ set -x
$ echo $TERM
+ echo xterm-256color
xterm-256color
$ set +x
Para evitar que os comandos digitados sejam gravados no history, podemos usar a opção +o
history:
$ set +o 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
É 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.
unset
$ unset [variável]
Ex.:
$ LIVRO="Certificação Linux"
$ echo $LIVRO
Certificação Linux
$ unset LIVRO
$ echo $LIVRO
printenv
$ printenv [variável]
Exemplo:
$ printenv PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/ec2-
user/bin
Somente as variáveis exportadas com o comando export são impressas pelo printenv.
Veja o exemplo:
$ export BOOK
$ printenv BOOK
Certificação CompTIA Linux
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".
Desta forma, a primeira linha do script deve indicar qual será o interpretador de comandos
que será utilizado para ler e executar o script.
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".
#!/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
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.
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.
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+
No entanto, o script poderá ser executado com as permissões de outro usuário se utilizado o
comando "sudo".
#!/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)
$ 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
Para utilizar ler o valor da variável de retorno, ela precisa ser verificada imediatamente após
a execução do comando desejado.
$ echo $?
0
#!/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
$_ O sublinhado (underscore) contém o nome absoluto do arquivo do shell ou script que está sendo
executado como passado na lista de argumentos.
#!/bin/bash
616 Licenciado para: Roque Laécio dos Santos
Souza
90587243520
Certificação CompTIA Linux+
Expansões de Shell
$( )
` `
Exemplo de expansão:
#!/bin/bash
HOJE=$(date "+%d/%m")
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:
Também é possível fazer substituições, usando a barra comum "/", buscando uma ocorrência
e substituindo por outra:
source
$ source arquivo [argumentos]
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
#!/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.”
$ 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.
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
Neste outro exemplo ele testa com o "-d" se o arquivo /usr/src é um diretório:
$ test –d /usr/src
$ echo $?
0
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)
$ [ 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
Neste exemplo, forçamos o retorno verdadeiro com o comando "true" que sempre irá
retornar verdadeiro:
Se usarmos o comando "false", que sempre retorna falso, o operador && não vai executar o
comando à esquerda:
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.
Já agora, o forçando o retorno falso com o comando false, o II executa o comando echo:
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:
if [ $? = 0 ]; then
echo ‘O comando foi completado com sucesso...’
else
echo ‘O comando falhou.’
fi
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.
O operador ")" termina uma lista de padrões e inicia uma lista de comandos.
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
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.
$ ./meucase
Você é o Uirá.
fim
$ 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
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.
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
Veja o exemplo:
$ ls -1 > lista_arquivos.txt
Pode-se agora usar o for para executar diversos comandos para cada arquivo da lista:
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:
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.
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.
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"
Simulado
5.2 Controle de Versão com Git
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.
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.
$ mkdir projeto
$ cd projeto
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/
$ 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:
$ cat ~/.gitconfig
[user]
name = Uira Ribeiro
email = uribeiro@gmail.com
Para adicionar um novo projeto a um repositório remoto, deve-se primeiro criar o repositório
remoto, através do site do 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:
Desta forma, todos os arquivos da última versão serão copiados para o diretório de trabalho
recém criado chamado "aulas".
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 *
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.
$ 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
$ 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
Desta forma, ele enumera os arquivos que foram alterados, adicionados e apagados,
comprime, e envia para o repositório remoto.
$ git pull
Already up to date.
Figura 57 - Git
Criando um Branch
Um branch é uma ramificação no controle de versão e no gerenciamento do desenvolvimento
do software.
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.
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.
Para se criar uma ramificação de arquivos do projeto, pode-se usar o comando "branch"
para criar uma ramificação:
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:
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.
$ git branch
livro
* master
Para mesclar o branch livro com o branch master, usa-se o comando merge:
Simulado
5.3 Processos e Conceitos de
Orquestração
DevOps
O termo DevOps foi cunhado para se designar a junção do desenvolvimento de software com
as operações de infraestrutura.
Para que isto funcione, todo o ambiente de funcionamento do software precisa ser
controlado.
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.
As ferramentas de orquestração de infraestrutura como Chef e Puppet podem fazer tudo isso
de forma automatizada.
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".
Ferramentas de Orquestração
Kubernetes
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.
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
Ele foi projetado para ser simples, eficiente e com uma experiência de usuário bem
transparente.
Orquestração de Contêineres;
Gerenciamento de clusters;
Rollback automático;
Load Balance;
Auto-recuperação;
Execução em lote (batch)
Escalonamento horizontal;
Livro Desenvolvedores
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.
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
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.
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.
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.
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.
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.
head $ head [opções] $ head —n 50 readme.txt O comando head serve para ler
arquivo somente as primeiras linhas de
um arquivo.
iptables iptables [opções] # iptables -A INPUT -p tcp -- Cria, apaga ou modifica regras
[chain] [regras] dport 80 -j ACCEPT no Netfilter
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 ... ]
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.
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.
passwd # passwd [opção] login # passwd uira O comando passwd entra com
a senha para uma determinada
conta de usuário.
pkill $ pkill [-sinal ] PID $ kill -9 2314 O comando kill envia sinais
para os processos.
printf $ printf FORMATO $ printf "Meu nome é" "Uirá" Formata e imprime dados
ARGUMENTO
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.
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.
scp $ scp [opções] origem $ scp arquivo uira@servidor:/tmp Copia arquivos remotamente
destino
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.
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.
time $ time comando $ time find / -name uira Mostra o tempo de execução
de um programa.
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.
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.
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.
Í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
Y Z
yum 191 zypper 198