Documente Academic
Documente Profesional
Documente Cultură
Se você ainda não me conhece, sou o professor Juliano Ramos. Tenho dedicado um grande tempo da minha
vida aos estudos de Linux e servidores. Sou professor por amor. Para mim não é trabalho, ou qualquer
outra definição. Acredito que é por isto, que sempre procuro fazer o diferencial e minhas aulas.
www.certificacoes.net.br
Possuimos diversas opções de treinamento como preparatórios para certificações e cursos de servidores.
Qualquer dúvida, só me encaminhar um e-mail: profjulianoramos@gmail.com
Certificado Comptia Linux, Linux Professional Institute, Red Hat, SUSE, PMI, Microsoft e Cisco. Professor,
aluno e hacker/geek em sua melhor definição. Apaixonado pelo movimento Open Source desde sua
revolução ao modelo de Software Livre em meados de 1998.
Licença de uso
Este livro não pode ser comercializado. Ele foi criado para ser usado como apostila de apoio pela empresa
Certificações NET.BR em cursos ministrados pelo Prof. Juliano Ramos. Todos os direitos deste livro
pertencem a empresa referida e ao autor.
Você pode: Ler este livro e compartilhá-lo. Mas não pode, alterar seu conteúdo ou comercializá-lo de
nenhum modo.
Sumário
Bem-vindo!
Fazer o nosso curso
Licença de uso
Sumário
Preparatório LTC1, LPIC1 e Comptia Linux+
LPIC - Linux Professional Institute Certificate
LPIC1
CompTIA - Computing Technology Industry Association
Linux+ - CompTIA POWERED BY LPI
Sobre o curso
Ame o pinguim
Virtualbox
Distribuições Linux
Distribuição leve
Comandos GNU e UNIX - Tópico 103
103.1 - Como trabalhar na linha de comando.
Como saber qual Shell estou utilizando?
O que é um comando?
Como o SHELL sabe localizar um comando externo?
Quando o comando não está no PATH?
Variáveis de ambiente - Local e Global
Ver todas as variáveis
Ver apenas as variáveis globais
Como remover uma variável
Variáveis pré-definidas
PWD
Comandos de modo sequencial
Navegar pelos comandos - histórico
Limpar arquivo de histórico
Pesquisar um comando que já digitei
Auto-completar do Bash
Obter ajuda
Informaçãoes do sistema
Apelidos de comandos
Tópico 103.2 - Arquivos de texto
Cabeçalho do arquivo
Rodapé do arquivo
Paginação da saída de texto
Ver a quantidade de linhas, caracteres e palavras de um arquivo
Ordenar um arquivo
Ver entradas únicas em um arquivo
Trocando tabs por espaços
Trocar espaços por tab
Exibir texto em formato octal e outros
Combinar arquivos através de um indice
Dividir um arquivo
Apagar e Substituir caracteres
Formatar uma saída de texto
Preparar um arquivo para impressão
Recortar partes de um texto
A ferramenta poderosa sed
Gerenciamento de arquivos - Tópico 103.3
Copia de arquivos
Copiando diretórios
Mover e renomear um arquivo
Criando arquivo de texto vazio
Remover arquivos e diretórios
Remover diretório vazio
Criar um diretório
Procurar arquivos e diretórios
Agrupando arquivos
Compactando arquivos
Usando somente o tar
Usando o cpio
Copiar uma partição inteira
Redirecionamento de entrada e saída - Tópico103.4
Redirecionamento do erro
Um erro comum de redirecionamento
Visualizando a saída e criando um arquivo
Saída de um comando como entrada para outro comando
Iprimindo o resultado de um comando
Exercícios
103.1 - Linha de comando
103.2 - Filtros de texto
103.3 - Gerenciamento básico de arquivos
103.4 - Fluxos, pipes e redirecionamentos.
Gerenciamento de processos - Tópico 103.5
Comando ps
Comando pstree
Ver os PID dos processos
Comando top
Comandos para monitorar, parar e matar processos
Comando killall
Comando pkill
Comando para gerenciar os processos
Controle de tarefas
Exercício do tópico 103.5
Modificar prioridade de processos
Pesquisar arquivos de texto com expressões regulares - Tópico 103.7
Comando grep
Comando egrep
Tabelas de exemplos:
Exercício:
Edição básica de arquivos usando o VI - 103.8
Editor de texto VIM
Editor de texto vim
Como interpretar atalhos e comandos
Os modos do VIM
Abrindo caminhos dentro de um arquivo
Abrindo arquivo em uma linha específica
Alternando entre arquivos
Movimentando-se sobre o texto
Inserindo texto
Deletando texto
Copiar e colar
Recortar e colar
Substituição
Buscando texto dentro do arquivo
Arquitetura do sistema - Tópico 101
Identificar e configurar os dispositivos de Hardware - tópico 101.1
IRQ - Sinais de interrupção
Endereços de I/O - Entrada e saída
Endereços DMA
Barramentos
As partições virtuais
Dispositivos de armazenamento
Arquitetura do kernel Linux
Trabalhando com módulos
Quais módulos estão disponíveis?
Compilando um kernel
Tópico 101.2 - O Boot do sistema
Alterando os Runlevels, Shutdown e Reboot - Tópico 101.3
SystemD
Comandos do systemD
Iniciar, parar e reiniciar serviços
Comandos de shutdown e restart
Tópico 102
Quais as vantagens de um particionamento?
Sistemas de particionamento
Arquivo de swap
LVM - Logical Volume Manager
Comandos essenciais
102.2 - Configuração de boot loader
Principais arquivos de configuração
Criando uma entrada para o Windows
Trocar a senha de root - Grub
102.3 - Bibliotecas compartilhadas
Comandos básicos
Incluir uma biblioteca
102.4 - Gerenciamento de pacotes Debian
O comando dpkg
Comandos do apt
O comando apt-get
Atualizando o sistema operacional
Buscando um pacote
Instalando e removendo um pacote
Apenas fazer o download do pacote
Comando dpkg-reconfigure
Comando dselect
Comando aptitude
O aplicativo alien
102.5 - Gerenciador de pacote RPM
Tópico 104 - Dispositivos, sistemas de arquivos Linux e FHS
104.1 - Criando partições e sistemas de arquivos
104.2 - Mantendo a integridade do sistema de arquivo
Comandos de análise de sistema de arquivo
Comando dumpe2fs
Partições xfs
Setar informações da partição
104.3 - Controle de montagem e desmontagem de partições
Criando e montando a partição
Fstab
auto
ro e rw
auto e noauto
user e nouser
exec e noexec
sync e async
defaults
Exemplos de linhas no fstab
104.4 - Gerenciando cotas de discos.
104.5 - Gerenciando permissões e propriedades do arquivo
Permissão Literal
Permissão octal
Permissões Especiais
Comando chown, chgrp
Tópico 104.6 - Criando e alterando Links Hard e Soft - in
Link simbólico
104.7 - Localização de arquivos no linux
Comandos de busca de arquivos
Comando locate
Comando whereis
Comando which
Comando type
Agradecimento
LPIC1
1. Voltada para Administadores de sistemas Linux
2. O profissional deve ser capaz de realizar tarefas de manutenção, instalação e configuração em
qualquer sistema linux, via linha de comando.
3. 2 provas: LPI 101-400 e 102-400. Cada uma com 60 questões e 1:30 de prova.
Para você receber a certificação LPIC1 é necessário ser aprovado nas 2 provas.
Sobre o curso
O Curso é baseado no programa da LPIC-1
Ame o pinguim
Faz parte do processo de aprendizado destruir o sistema :-), então, use sempre uma máquina virtual.
Virtualbox
Referência:
https://www.virtualbox.org/
Distribuições Linux
As certificações da LPI e da CompTIA não são focadas em nenhuma distribuição específica, dessa forma
você pode estudar e praticar em qualquer distribuição Linux.
Nas próximas aulas eu mostro como instalar a distribuição Xubuntu, essa escolha foi apenas por esta ser
uma distribuição simples de ser utilizada e bem leve, mais do que o suficiente para nossos objetivos neste
curso.
Mas você pode utilizar a distribuição que preferir, Debian, Ubuntu, Fedora, CentOS, etc. As diferenças serão
mínimas e quando ocorrerem eu informo durante a aula.
Distribuição leve
Como a certificação de linux é independente de distribuição e vamos focar somente na linha de comando,
usaremos uma distribuição bem leve que roda sobre Debian - chamada Bunsenlabs.
https://www.bunsenlabs.org/
Download do arquivo ISO (imagem de CD/DVD e até mesmo de uma partição ou disco).
O número é o "peso", que nada mais é a quantidade questões que vão estar na prova.
Temos vários tipos de SHELL como : Ksh, SH, Dash, FISH entre outros.
# echo $SHELL
/bin/bash
# bash
O que é um comando?
Um comando pode ser um programa externo (Instalado no linux) ou um comando interno (do próprio
shell). Para saber se é um comando interno ou externo, usamos o comando type, exemplo:
# type echo
Outro exemplo:
# type tar
tar is /bin/tar
Neste caso ele mostra o caminho, dizendo que não é um comando interno do shell. As vezes pode-se
observar a saída: clear is hashed que significa que o comando é externo mas está em cache.
Existe uma variável do SHELL que guarda o caminho dos executáveis, esta variável, chama-se PATH.
# echo $PATH
Neste caso teremos que referênciar o caminho do comando. O comando pwd mostra o nosso diretório
atual, exemplo:
# pwd
O Linux tem uma estrutura hierárquica de arquivos que começa no /(barra). Podemos navegar por estes
diretórios através do comando cd, exemplo:
# cd /home/aluno
# ls
Ao executar o seu comando que é externo e não está no diretório PATH, você executa-o com o ponto barra,
que significa - este diretório, exemplo:
#./meuprograma.sh
Digamos que você não esteja no diretório do programa, mas deseja executá-lo, neste caso você deve digitar
o caminho completo do programa:
# /home/aluno/script/programa.sh
Assim que você inicia o SHELL várias variáveis de ambiente são carregadas. Veja como declarar uma
variável no SHELL:
# NOME_VARIAVEL=valor
# echo $NOME_VARIAVEL
Esta variável é local, só esta disponível neste SHELL. Para que os processos possam visualizar está variavel e
novas seções, eu preciso usar o comando export, exemplo:
# export NOME_VARIAVEL
Ao executarmos o comando export tornamos a variável Global, de modo que poderá ter acesso em novas
seções. Podemos já criar a variável como global:
O comando set me permite visualizar todas as variáveis, porém como é muitas o melhor é páginar, ou seja,
visualizar por página a saída do comando:
# set |less
O comando env visualiza apenas as variáveis externas, ou seja, somente o que foi exportado.
# env |less
O env permite alterar o valor de uma variavel somente para uma execução. Para exemplificar, crie com seu
editor simples o seguinte arquivo:
#/bin/bash
echo $LINUX
Salve como programa.sh e feche este arquivo. Daremos permissão para ele ser um executável (veremos
isto mais a frente):
# chmod +x programa.sh
Rode o programa:
# ./programa
Eu amo
O resultado é "Eu amo", agora vamos mudar o valor da variável, somente na execução deste programa:
Veja que o resultado somente nesta execução foi "Muito bom", mas o valor da variável LINUX continua
sendo "Eu amo".
# unset LINUX
Variáveis pré-definidas
É importante conhecermos algumas variáveis que podem ser cobradas no exame. Podemos verificar
algumas usando:
# set |less
HISTFILE
HISTSIZE
HOME
PWD
SHELL
Mostra o Shell Atual
Hostname
O nome da máquina
TERM
PS1
# clear; date; ls
No exemplo acima ele irá rodar os três comandos, independente se todos eles forem sucesso.
Outra forma é:
O segundo comando só é executado se o primeiro tiver sucesso. Como não temos o arquivo
qualquercoisa.txt o segundo comando não será executado.
Outra forma é:
Com a seta para cima e para baixo, você navega pelos comandos digitados. Você pode verificar o histórico
de comandos usando:
# history
# !!
Neste caso ele vai executar o comando que está na linha 19 da saída do comando history
history -C
Observe que eu digitei set |grep HISTFILE neste caso o grep vai filtrar a saida do comando set. O resultado
foi: HISTFILE=/home/juliano/.bash_history
# cat /home/juliano/.bash_history
No linux, arquivos que se iniciam com . (ponto) são ocultos. Este arquivo é salvo sempre que a seção é
fechada. Cada usuário visualiza apenas o seu .bash_history, já o usuário Administrador - Root, visualiza o
histórico de todos os usuários.
Para realizar uma pesquisa pelo history você pode usar a teclas de atalho: +
Auto-completar do Bash
Podemos usar a tecla para auto-completar, quando você começa a digitar um comando e digita duas vezes,
ele te mostra comandos que começam com a string que você está digitando:
juliano@DarthVader:~$ ls
ls lsb_release lshw lslocks lsof lspgpot
lsattr lscpu lsinitramfs lslogins lspci lsusb
lsblk lsdiff lsipc lsmod lspcmcia
juliano@DarthVader:~$ cd /
bin/ etc/ lib64/ opt/ sbin/ tmp/
boot/ home/ lost+found/ proc/ snap/ usr/
cdrom/ lib/ media/ root/ srv/ var/
dev/ lib32/ mnt/ run/ sys/
Obter ajuda
Praticamente todos os comandos tem um manual de referência acessados pelo comando man exemplo:
# man ls
Alguns arquivos de configuração também possuem páginas de manual. Quando o comando é interno do
bash, você deve visualizar no :
# man bash
Exemplo o comando cd. O man é uma ferramenta muito importante para o Administrador de sistemas
Linux e para candidatos aos exames de certificação.
Outro comando de ajuda é o info que é uma espécie de man reduzido. Uma opção interessante é a opção
info -k que permite pesquisar por um determinado conteúdo, exemplo:
apropos information
Informaçãoes do sistema
# uname --help
Mostra as informações que podemos obter com este comando, digitando parâmetros. Exemplo:
# uname -r
Apelidos de comandos
No meu caso, quando digito ls na verdade, ele vai executar: ls --color=auto isto está definido em um
arquivo que é lido durante o boot do sistema, que veremos mais a frente. Para criar o nosso atalho,
usamos:
Agora sempre que digitarmos o comando que criei chamado lt ele vai executar o comando: ls /tmp. Por
enquanto isto se perde quando fecharmos a seção, mas a frente vamos aprender a colocar na inicialização
do sistema.
# cat /etc/passwd
O comando pega o arquivo e redireciona para a saída padrão (tela). Podemos ver as linhas numeradas:
# cat -n /etc/passwd
# cat -b /etc/passwd
# cat --help
O comando tac inverte a saída, mostrando o resultado de baixo para cima - inverso ao cat.
Cabeçalho do arquivo
# head /etc/passwd
Ele mostra as 10 primeiras linhas. Se desejamos verificar por exemplo, apenas as 2 primeiras linhas,
usamos:
Rodapé do arquivo
# tail /etc/passwd
Outro comando interessante do tail é a opção -f, que mantém o arquivo aberto esperando mais
informações, excelente para logs. Exemplo:
# tail -f /var/log/auth.log
Este arquivo mantém informações de login, abra outro terminal ou tty e faça login, você verá que
automaticamente o tail mostrou.
Temos o comando less e o more, a LPIC cobra apenas o less. Este comando permite navegar pelo arquivo:
# less /etc/passwd
Com seta para baixo ou cima, navegamos linha a linha. Se apertamos ele pula para a próxima página.
Podemos fazer busca na saída usando barra (/) exemplo: /juliano ele vai procurar na saída do comando a
palavra juliano, se tiver mais de uma, usamos n de next, para voltar + .
Usamos muito o less com o pipe (|). O pipe pega a saída do primeiro comando e usa como entrada para o
segundo comando. Exemplo:
juliano@DarthVader:~$ wc /etc/passwd
40 70 2252 /etc/passwd
Sendo no meu caso: 40 linhas, 70 palavras e 2252 caracteres. Ver somente linhas:
# wc -l /etc/passwd
# wc -c /etc/passwd
# wc -w /etc/passwd
Podemos usar o comando nl ele é semelhante ao cat -b, ele numera as linhas sem considerar as linhas em
branco:
# nl /etc/passwd
Ordenar um arquivo
# sort /etc/passwd
# sort -r /etc/passwd
juliano
juliano
maria
joaquim
juliano
# uniq alunos.txt
Mostrou a frente as vezes que tenho aquele nome e a linha em branco (1). É muito útil usarmos o sort para
ordenar junto com o uniq, exemplo:
Usamos o comando expand para mudar tabulação para espaço, ele considera um tab como 8 espaços.
Sintaxe:
# expand arquivo.txt
Cada vez que ele encontrar um tab ele troca por 8 espaços. Mas este troca é só para imprimir na tela, mas
ele não altera o arquivo.
# unexpand arquivo.txt
Porém, ele por padrão só olha os espaços do começo da linha, mas você pode verificar em tudo, usando:
# unexpand -a arquivo.txt
Se você desejar, por exemplo, que a cada 2 espaços ele transforme em um tab, use:
# unexpand -t 2 arquivo.txt
O comando od mostra um arquivo em octal, mas ele permite outros formatos, verifique:
# od --help
1 Maria
2 Joao
3 Lucas
Salve como alunos.txt. Agora crie outro arquivo com o seguinte conteúdo:
1 10
25
3 3.8
Lembre-se que os índices devem ser iguais e as linhas devem estar na mesma ordem. Um comando
semelhantes é o paste, mas ele não se preocupa com indices. Ele simplesmente junta os arquivos.
Dividir um arquivo
Se você tem um arquivo longo, você pode dividir com o comando split exemplo:
Ele cria arquivos semelhantes a : xaa, xab e etc... Cada arquivo agora terá 3 linhas.
O comando tr é usado para substituir caracteres, mas ele deve ser usado com pipe. Exemplo:
# cat /etc/passwd | tr ei EI
Altera juliano para grubelilo. Para excluir um caractere use a opção -d exemplo:
Quando temos linhas muito longas em um texto, podemos reduzir a quantidade de caracteres usando o
comando fmt que por padrão usa 75 caracteres. Você pode definir o tamanho, usando:
# fmt -w 20 /etc/passwd
O comando pr vai preparar o arquivo para impressão, colocando data e cabeçalho. Exemplo:
# pr texto.txt
Usado para substituir, deletar conteúdo de um texto e para expressões regulares que veremos a frente.
Exemplo:
Sempre que encontrar a palavra: ramos ele substitui por oliveira. Desta forma de uso ele só substitui a
primeira ocorrência de cada linha. Para substituir tudo é preciso usar:
Apagamos da linha 3 a linha 5. Podemos definir que sempre que aparecer a palavra juliano, ele apagar a
linha.
# sed '/juliano/d'alunos.txt
# cd ..
# cd ../../
# cd ~
Para listarmos os arquivos de um diretório usamos o comando ls, com a opção -a, podemos verificar
arquivos ocultos:
# ls -a
Arquivos ocultos começam com . (ponto). Outra opção comum é -l, que mostra uma lista detalhada,
podemos usar em conjunto com o -a para um melhor resultado:
# ls -la
Outra opção interessante é usar o -h para ver os valores em kbyte, mbyte e etc...
# ls -lha
# ls -R /etc/
Para listar somente arquivos que tenha a extensão .txt usamos o caractere curinga asterisco. Exemplo:
# ls *.txt
Digamos que você tenha uma lista com varios arquivos chamados: aula1, aula2, aula3 e etc... Você pode
definir quais listar usando:
# ls -l aula[123]
# ls -l aula[!123]
# ls -l aula[10-20]
# ls -l aula{10,20,30}
Copia de arquivos
# cp origem destino
Exemplo 2 :
# cp /etc/passwd /tmp
# cp -v /etc/passwd /tmp
Para perguntar se deseja sobrescrever um arquivo, use o hábito sempre de usar: -i , exemplo:
# cp -i /etc/passwd /tmp
Caso já tenha o arquivo ele te pergunta se deseja ou não sobrescrever o arquivo, por padrão, ou seja, sem a
opção -i, ele sobrescreve sempre.
Copiando diretórios
O cp não copia por padrão diretórios, mas podemos resolver isto usando a opção de recursividade:
# cp -r diretorio /tmp/
# mv diretorio /tmp
# mv arquivo /tmp
# mv arquivo arquivo2
# touch arquivo.txt
Também podemos alterar a data e hora de alteração de um arquivo. Se você usar ls -l arquivo.txt vai poder
visualizar a hora de modificação do arquivo. Para mudar a data do último acesso:
# touch -a arquivo.txt
# touch -m arquivo.txt
Alterei para Ano 2017, Mês 01, Dia 01, hora 10:00 tempos anteriores só mostra o ano, ignorando a hora.
O comando é o rm exemplo:
# rm arquivo
Remove o arquivo sem perguntar, se você quer que ele pergunte, use:
# rm -i arquivo
# rm -r diretório
Para remover diretório vazio, pode-se usar o comando rmdir na prática, acabamos sempre usando o rm.
Criar um diretório
# mkdir diretorio
Se você desejar criar um diretório com outro diretório use -p ou --parents que tem mesmo efeito.
# mkdir -p diretorio/diretorio2/diretorio3
No comando acima ele vai procurar o arquivo1.txt dentro do diretório /home. Para vermos todos que
começam com aula, usamos:
Agora só vai procurar arquivo1 do usuário juliano. Para procurarmos arquivos por data de modificação:
find ./ -ctime -1
Neste caso, estou procurando a partir do meu diretório atual (./) arquivos modificados no último dia.
Agrupando arquivos
Usamos:
c Criar o arquivo
Neste caso, não estamos compactando, ou seja, diminuindo o tamanho, estamos apenas agrupando.
Compactando arquivos
Para iniciar, vamos começar com o gzip, usando aquele arquivo que agrupamos:
# gzip backup.tar
Observe que ele gera um novo arquivo chamado: backup.tar.gz que significa que esta compactado. Para
descompactar usamos:
# gunzip backup.tar.gz
Ele remove o backup e volta ao original backup.tar. Se você deseja criar o compactado e manter o original,
use:
# gzip -k backup.tar
# bzip2 -k backup.tar
# bunzip backup.tar.bz2
# xz backup.tar
Para descompactar:
# unxz backup.tar.xz
Podemos usar também para decompactar a opção -d : gzip -d, bzip2 -d, xz -d. Vale lembrar que eles
compactam qualquer arquivo e não somente arquivos .tar como no exemplo.
Para xz usamos:
Para verificar como foi compactado determinado arquivo (caso não tenha extensão) use o comando file
exemplo:
# file nome_do_arquivo
Para descompactar qualquer um deles só altere c para x e a letra do formato que está compactado,
exemplo:
Usando o cpio
O cpio é semelhante ao tar, porém, ele necessita de uma lista de arquivos como entrada. Por padrão
usamos ele com o comando find, exemplo:
Neste caso estamos criando o backup do diretório /tmp com o nome backup.cpio. Para desagrupar,
usamos:
O comando dd permite uma copia bit a bit de uma partição ou até mesmo de um disco inteiro. Você pode
verificar as partições que você tem no sistema com o comando:
# df -h
# dd if=/dev/sda of=/dev/sdb
No exemplo acima criamos uma cópia exata de um disco para outro. Isto é importante, por exemplo, no
caso de um backup de servidor. Se você quiser fazer uma imagem (.iso) de um disco (DVD, Blu Ray) utilize o
comando:
# dd if=/dev/sr0 of=imagem.iso
Quando você desejar redirecionar a saída padrão use o sinal de maior ( > ). Exemplo:
No exemplo acima, ao invés do resultado do comando ls ser a tela do computador, estamos enviando esta
saída para um arquivo, chamado: saida.out. Se você usar o cat ou o less neste arquivo, perceberá que o
conteúdo da listagem está no arquivo.
# cat saida.out
Quando você utiliza o maior (>) ele sobrescreve o arquivo que existir. Por exemplo:
# df -h > saida.out
Ele vai reescrever o arquivo saida.out colocando o resultado do comando df -h. Para adicionar conteúdo e
não reescrever, use ( >> ), exemplo:
Redirecionamento do erro
Por exemplo, se você listar um arquivo que não existe, o resultado sai na saida padrão STDIN1:
# ls /tmp/arquivo-inexistente
ls: não é possível acessar /tmp/arquivo-inexistente: Arquivo ou diretório não encontrado
# cat saida_ls
Digamos que você queira fazer duas saídas, uma para o padrão STDIN1 e outra para erro STDERR2. Como
exemplo, vou usar 2 arquivos, um que exista no diretório e outro não.
#touch /tmp/existo
ls -l /tmp/{existo,nao-existo} > saida-ls.out 2> saida-ls-erro.out
Digamos que você tenha um aquivo chamado texto.txt com duas linhas, exemplo:
Olá Mundo
Sou o Tux
Você deseja colocar os números das linhas a frente e resolver usar o comando nl exemplo:
Agora você decide reeditar este arquivo com a saída do comando nl, muitos alunos, fazem:
Pode parecer que está certo, mas tente visualizar o conteúdo do arquivo texto.txt e ficará surpreso, ele
está vazio. Isto por que o Shell vai criar o arquivo e como ele já existe ele apaga o atual.
Diga: Encaminhe a saída alterada para um arquivo com um nome diferente. Exemplo:
# nl texto.txt > texto.tmp
# mv texto.tmp texto.txt
O comando tee permite que eu visualize a saída do comando e ao mesmo tempo crie um novo arquivo
com esta informação. Sua sintaxe:
Veja que você teve a saída do comando, mas também terá um arquivo chamado novo_arquivo.tmp com
esta informação.
Para pegarmos a saída de um comando e usarmos como argumento para outro comando, usamos o
comando xargs. Exemplo prático:
No exemplo acima, ele pega o resuldado da busca de arquivos (passwd) dentro de /etc e usa como
argumento para o comando ls -l.
Outro modo é:
Exercícios
Que tal uma pausa para estudar um pouco sobre o que já abordamos? Faça os exercícios abaixo.
2) Crie e exporte uma variável chamada LINUX com o valor: Eu amo!
1) Gere um comando que mostre as linhas do arquivo /etc/passwd excluindo-se as linhas que contenham a
palavra "daemon".
1) Gere um arquivo de saída com nome saida.out, conteúdo o resultado de ls -l no diretório /etc somente
dos arquivos que contenham a string config.
2) Explique os redirecionadores:
> arquivo:
< arquivo:
>> arquivo:
2> arquivo:
>arquivo 2>&1:
Comando ps
O comando ps é usado para mostrar os processos da máquina. O comando ps tem diversas opções,
usaremos as que possivelmente vão estar no exame.
Ao executarmos apenas ps vamos visualizar apenas os processos do nosso usuário em nosso terminal.
# ps
# ps -u
Agora podemos visualizar além do PID, algumas informações como uso da CPU e da memória que este
processo esta consumindo. Outra opção muito utilizada é o -x que mostra processos que não foram
iniciados diretamente em nosso terminal.
# ps -ux | less
Para visualizar todos os processos incluindo processos de outros usuário, usamos -a exemplo>:
# ps -aux | less
Para ver em formato de árvore hierárquica de processos, podemos usar a opção -f exemplo:
# ps -auxf | less
# ps -alx | less
Usamos muito o comando ps com o pipe para filtrar uma saída, exemplo:
Comando pstree
# pstree
# pstree -p
Observe que o pstree mostra que o PID 1 é o systemD. O init era o sistema antigo de inicialização que hoje
aponta para o systemD. Então de fato o processo 1 é o SystemD. Mas em uma questão no exame sobre
qual seria o processo 1, seria INIT (por padrão).
Comando top
O comando top é um dos principais comandos para monitorar o desempenho da máquina. Ao digitar o
comando top sem nenhum parâmetro, você terá uma tela interativa, com diversas informações sobre o
equipamento, que inclui: Número de processos, uso de CPU, Memória entre outros.
Dentro do comando top se você digitar: shift + M irá visualizar os processos que estão consumindo mais
memória.
Para mostrar processos apenas de um usuário, digite u e o nome do usuário na caixa de dialogo. Vazio,
para todos.
# top -b
Isto é útil para criação de log. Mas vale lembrar que o ps faz isto muito bem.
Antes de tudo, segue uma tabela sobre sinais de processos, será útil a seguir:
SIGTERM 15 O sinal solicita que o processo se finalize. Sinal padrão do comando Kill.
# kill PID
O kill sem nenhum parâmetro, usa o sinal -15 (SIGTERM). Para descrever o sinal, você pode usar o
paramêtro -s exemplo:
# kill -9 PID
Comando killall
O comando killall mata os processos baseado nos nomes do processos e não no seu número de PID.
Exemplo:
# killall firefox
Obs: Os processos possuem permissões, apenas o root pode matar os processos de qualquer usuário. Um
usuário comum não pode matar o processo de outro usuário comum.
Comando pkill
O pkill permite que você faça um filtro em processos pelo nome e pelo nome do usuário. Exemplo:
Digamos que você está no servidor como root e tem 4 usuários rodando o processo firefox, para matar
este processo apenas do usuáro juliano, você iria executar:
O comando uptime mostra a quanto tempo a máquina está em funcionamento. Outro comando que
também sai no top é o free que mostra a quantidade de memória disponível. Usamos a opção -m para ver
em (KB,MB ou GB).
O used engana as vezes muitos usuários. Na verdade o seu valor é a quantidade de memória alocada para
o Linux e não necessáriamente que ela está em uso. Agora, fique atento a memória swap, pois quando ela
está em uso é por que a memória RAM já chegou ao seu máximo.
O screen é uma ferramenta para trabalharmos em várias abas. Muito útil quando estamos trabalhando em
sessão remota como ssh. Funcionamento básico:
# screen
# <ctrl> + <c>
# <ctrl> + <n>
Ao abrir o screen você cria uma nova aba com ctrl+c e visualiza as existentes com ctrl+n. Para iniciar uma
nova aba já com um comando, execute:
# screen nome_do_comando
# screen top
Controle de tarefas
# firefox
Você abre o firefox mas seu terminal não pode mais ser utilizado até o firefox ser fechado, chamamos isto
de processo em foreground. Para executar um processo, liberando nosso terminal, usamos o que se
chama processo em background, neste caso, basta colocar um & comercial ao final do comando:
# firefox &
[1] 55335
Ao executar este comando, ele mostra o ID do Job e o PID do processo. No exemplo acima, número do Job
[1] e o PID 55335. O comando jobs mostra os processos em background:
# jobs -l
Outra forma de colocar um processo em background é abrir uma aplicação e depois digitar: +
Quando você executa isto, ele fica em stopped ou seja, o processo não foi finalizado, mas não está
funcionando. Se você digitar bg ele pega o último processo e coloca em background, liberando assim o
funcionamento do processo. Se você desejar colocar o processo em foreground você usa o comando fg.
Você pode especificar o processo colocando o número, exemplo:
# bg 2
# fg 2
Podemos evitar alguns sinais, menos o sigkill (-9). Para não permitir por exemplo o SIGHUP(1), podemos
usar o comando:
# nohup firefox &
Isto é útil por exemplo: Se tivessemos executado o comando acima remotamente, ao fechar a seção, não
seria fechado o firefox.
2) Execute um processo em foreground, faça stopped depois coloque ele para ser executado em
background. Coloque de volta o processo em foreground e por outro terminal, finalize este processo com
SIGKILL.
Quando você executar o comando top observe a coluna NI ela mostra o valor da prioridade de um
processo. Quanto menor o valor da prioridade maior é a quantidade de recurso para o processo.
Os valores são:
-20...........................................+19
O valor negativo é igual a mais prioridade, o positivo menor prioridade. Somente o usuário root pode
aumentar a prioridade do processo. O usuário comum pode diminuir a prioridade dos seus processos, mas
não pode aumentá-la.
Quando executar o comando top você pode verificar a prioridade na coluna NI (nice). Ou executando:
# renice -n -8 PID
# renice -u juliano -n 5
Pesquisar arquivos de texto com expressões
regulares - Tópico 103.7
Expressões regulares é um assunto muito intenso, existem cursos e livros apenas para isto. Vamos nos
concentrar apenas no conteúdo do exame Comptia Linux+.
O que é uma REGEX ou Regular Expression ? A expressão regular é um conjunto de caracteres que define
um padrão de texto.
Comando grep
O comando grep vai encontrar blocos de texto com uma string especificada, por exemplo:
Lembrando que é case sensitive ou seja, tem diferença entre minusculas e maiúscula. A opção -c vai
contar quantas ocorrências encontramos no arquivo:
Digamos que você queira procurar em diversos arquivos quantas vezes a palavra é repetida, poderia usar:
# grep -c juliano *
A opção -r é recursiva, ou seja, ele procura nos diretórios atuais e também dentro dos subdiretórios:
No exemplo acima, ele procura "juliano" dentro dos diretórios e subdiretórios /etc. Para expressões
regulares mais avançadas, usamos grep -E ou egrep. Que veremos a seguir com mais detalhes.
Neste caso, ele vai excluir JULIANO mas excluindo o case sensitive.
Comando egrep
Vamos trabalhar com expressões usando o egrep. Usaremos a expressão entre aspas "". Vejamos um
exemplo:
No exemplo acima estamos procurando palavras como bag,beg,big dentro do arquivo.txt. Podemos
também usar uma sequência:
No exemplo acima, ele vai mostrar palavras de A a U (aeiou). Podemos definir também, o começo da linha e
o seu fim:
Sempre mostrará a palavra Linux que estiver no começo do arquivo (^). Para exibir as palavras do final, use:
Exemplo prático:
Outro exemplo:
O * após, informa que tanto faz se o caracter g apareça ou não, o conteúdo deve ser exibido. Observe no
retorno que (baseado no linux) apareceu, isto por que tem (bas) da palavra baseado, mesmo que não tenha
g.
Neste caso a palavra "baseado" não apareceu, já que não tem a letra g.
Outra opção é o ?, ele define que irá aparecer ocorrência ou com nenhum ou com apenas 1 vez o caractere
g exemplo:
Observe que ele mostra "bigger" mas por que ele mostra a linha inteira. Para entender melhor faça:
Neste caso somente a palavra bege apareceu, mesmo eu tendo bigger. O ponto (.) é usado para definir a
quantidade de caracteres após o g que estamos usando no exemplo:
# egrep "b[a-i]g..."
bigger
beginner
No exemplo acima, estou definindo que quero 3 caracteres depois do g - por isto os três pontos.
Exemplo 2:
Tabelas de exemplos:
Expressão Regular Descrição Exemplo
Expressão
Descrição Exemplo
Regular
[a-z] ou [0- Range de caractere único. Determina qualquer caractere Versão[5-7] = Versão5,
9] dentros os pertencentes ao range. Versão6,Versão7
Versão[ ^ 0-7 ] =
[^abc] Negação do que está na lista.
versao8,versao9
Exercício:
1) Gere um comando que exiba na tela todas as linhas do arquivo /etc/passwd que terminem com
"nologin".
2) Crie um comando que liste todos os arquivos dentro do diretório /etc/ que contenham a palavra "snd"
em seu conteúdo, não nome de arquivo, a pesquisa deve incluir também subdiretórios.
# vi --version
Praticamente quase toda a configuração de um sistema GNU/Linux é realizada através da edição direta de
arquivos de configuração em modo-texto. São diversas aplicações que podemos utilizar para editar estas
arquivos, no entanto, como nosso foco é também se preparar para as certificações de linux, utilizaremos o
editor VIM.
Para definirmos no Debian qual será o nosso aplicativo de texto padrão, usamos o comando:
O VI é o editor básico do GNU/Linux, e está disponível em grande parte das distribuições de GNU/Linux.
Hoje em dia, as distribuições usam uma versão mais completa e com mais recursos do que o VI que é o
VIM = VI IMproved.
# vim
:help
Ou, simplesmente:
:h
A tecla é representada na maioria dos manuais e no help do VIM pelo caractere ^ circunflexo, ou seja, o
atalho para < control > + , aparecerá assim:
^L
Vou criar como exemplo um arquivo vazio e abrir o mesmo com o VIM:
# touch arquivo.txt
# vim arquivo.txt
Como estamos iniciando os nossos estudos com o editor VIM, é comum cometermos erros na edição de um
texto. Para recarregar este arquivo que está sendo editado, sem as alterações, execute:
Você também, pode optar em fechar este arquivo, sem salvar suas modificações:
Os modos do VIM
O VIM trabalha com três modos de operação. Vamos supor que temos o arquivo de nome texto.txt,
podemos abrir ele usando o comando:
$ vim texto.txt
Ele abre no modo de visualização. Quando pressionamos a tecla < i > ou < insert > ele abre o modo de
Inserção. Quando você pressiona a tecla < esc > ele volta para o modo de comandos. Neste modo, você
digita um comando colocando dois pontos a frente, exemplo:
:help
Entendendo melhor:
O modo de comandos é onde você vai formatar o texto (deletar, copiar e colar, replace e etc).
Caso esteja visualizando um arquivo no vim e este arquivo tenha alguma linha de referência a outro arquivo
dentro do sistema, você pode abrir esta referência, parando sobre a linha do arquivo, digitando < esc > e
depois as teclas:
Use a tecla < esc > deixe o cursor sobre a referência /etc/passwd pressione as teclas: < ctrl > + < w > + < f > ,
o VIM abrirá na parte superior este arquivo, para fechar, utilize:
Imagina a seguinte situação, você abre um arquivo de configuração como o do proxy squid3 que tem mais
de 7.000 mil linhas e precisa encontrar um determinado comando. Para não ficar um bom tempo
navegando sobre o arquivo, utilize:
Após a execução do comando acima, será exibido no terminal todas as linhas com o termo pesquisado:
Agora que temos o número da linha, no caso do comando acima que executei, linha "27", podemos abrir
este arquivo, executando:
Deste modo, já abrimos o arquivo /etc/passwd com o vim direto na linha 27.
Imagine, que você está digitando um script de backup e não alguns parâmetros de configuração que estão
em outro arquivo. Para não precisar fechar o editor, execute o comando abaixo:
:e /caminho/arquivo
Este comando vai permitir que você abra novos arquivos no VIM sem fechar o editor. Quando estamos
editando mais de um arquivo, usamos as teclas : <ctrl > + <6> para alternar entre eles.
Agora, vamos aprender algumas outras opções, notando que são case sensitive (tem diferença maiúscula e
minúscula.)
Inserindo texto
Para sairmos do modo de visualização do VIM e começarmos a inserir nosso texto, usamos as seguintes
teclas:
< i > Entra no modo de inserção
no local onde o cursor se encontra
< I > Entra no modo de inserção
no começo da linha
< a > Entra no modo de inserção
na frente de onde o cursor se encontra
< A > Entra no modo de inserção
no final da linha
< o > Adiciona uma linha acima
e entra em modo de inserção
< ESC > Volta ao modo
normal/comando
< v > Entra no modo VISUAL
Deletando texto
Copiar e colar
O melhor modo de se copiar algo no VIM é navegando até a linha ou palavra que se deseja, entrando no
modo visual (tecla v) e selecionando a linha com as teclas de movimentação. Após selecionar, use a tecla < y
> para copiar, saia do modo de visualização < esc > movimente-se até o local de colar e pressione < p >.
Recortar e colar
Para recortar e colar, use algum comando de exclusão (x, dd, dw ou d$), movimente-se até o local onde
deseja colar e use a tecla < p >.
Um recurso muito útil em qualquer editor de texto é a substituição de palavras. No VIM podemos usar, isto
é realizado no modo de comandos. Caso esteja no modo de visualização ou inserção, pressione a tecla <
esc > e depois < : > dois pontos, o comando abaixo fica a frente.
Para buscar texto dentro do vim, usamos no modo de comandos, sempre a frente do dois pontos (:) os
comandos abaixo:
Ao entrar no modo de busca, o VIM deixa a /palavra pesquisada na barra inferior, então, podemos usar:
A LPI não pergunta só comandos e sim conteúdo relevante ao dia a dia de um administrador de sistemas.
Processo básico de boot:
EFI e UEFI hoje são um padrão de BIOS, no entanto, para fins da LPI saiba apenas que BIOS é o sistema
básico de entrada e saída.
Em aulas de Hardware você já deve ter ouvido falar do IRQ, na prática, usamos pouco, mas na LPI ainda
pode acontecer alguma pergunta sobre. Não precisa decorar a lista, mas dê uma atenção aos IRQs
principais. Para visualizar o mapeamente do IRQ dentro do linux:
# cat /proc/interrupts
Em um sistema operacional, temos uma lista de endereços na memória que é utilizada para a comunicação
entre a CPU e os demais dispositivos de Hardware. No linux, visualizamos:
# cat /proc/ioports
Endereços DMA
DMA é um modo de o dispositivo de hardware falar direto com a memória (Direct Memory Addressing). Não
são todos os dispositivos que possuem, para listar o DMA do linux, usamos:
# cat /proc/dma
Barramentos
Barramento é a interface de hardware que você conecta seus dispositivos na placa mãe.
Os principais barramentos que são cobrados no exame: PCI e USB. Podemos visualizar o que está
conectado no barramento PCI, com o comando:
# lspci
Para maiores detalhes utilize o código do dispositivo obtido com o comando acima e execute:
# lspci -s 00:01.1 -v
# lsusb
Para detalhes:
# lsusb -s 001:001 -v
As partições virtuais
As partições virtuais, são partições dinâmicas, elas não contém dados de arquivos e sim, informações que
acontecem em tempo real. São elas:
/proc
/sys
/dev
dbus Comunicação entre processos, informa aos processos a situação dos dispositivos de hardware.
No linux, tudo é um arquivo ou um processo. Um dispositivo de armazenamento por exemplo, pode ser
/dev/sda1 que por sua vez é o caminho para o acesso físico. O udev é um processo de device manager, ou
seja, ele que monta e referencia os dispositivos em /dev.
O dbus/hald é responsável pela comunicação entre os processos do linux e entre outras funções, ele
informa, quando um novo hardware é adicionado ele é quem espalha esta informação aos processos.
Coldplug e Hotplug: Alguns dispositivos só podem ser trocados com a máquina desligada, exemplo:
Memória (apesar que alguns mainframes permite esta troca em hotplug), neste caso chamamos de
coldplug. Quando você adiciona um HD externo USB por exemplo, sem precisar desligar a máquina,
chamamos de hotplug.
Quando executamos o comando df -a visualizamos além das nossas partições, estas partições virtuais:
# df -a
Dispositivos de armazenamento
PATA - Também chamado IDE é uma tecnologia paralela (Parallel Advanced Technology Attachment). IDE é
referência à interface de conexão. Descrição deste sistema:
Um drive de CD / DVD, conectado a um IDE, também será referenciado como hdx. Após o PATA temos o
SATA - Serial Advanced Technology Attachment, sua descrição:
tipos:
SCSI_ID
# /proc/scsi/scsi
Outros dispositivos:
Ao instalar o Debian ou outra distribuição Linux, estamos utilizando o kernel que foi compilado pelos
desenvolvedores da distribuição. Este kernel padrão, deve ser capaz de rodar em praticamente qualquer PC
e dar suporte a diversos tipos de recursos que o usuário pretenda utilizar, como sistemas de
arquivos,suporte a usb, suporte a diferentes tipos de protocolos de rede entre outros. O desenvolvedor
compila um kernel básico, com poucas funcionalidades e cria pedaços de código com funções específicas
que podem ser adicionados a este kernel, estes pedaços de código são chamados de módulos.
Quando o sistema é carregado, este kernel básico é colocado na memória e passa a controlar a máquina.
Digamos que você possui uma partição com o sistema de arquivos NTFS que não está no kernel básico
padrão. Durante a inicialização do sistema, o kernel básico vai procurar se o módulo que dá suporte para
este tipo de sistema de arquivos está disponível. Se este módulo for encontrado, ele será carregado
expandido assim as funcionalidades do kernel.
O desenvolvimento de uma nova funcionalidade para o kernel linux pode ser implementada diretamente
no kernel ou compilada como um módulo. De modo geral, a escolha tende a ser a compilação como
módulo. Isso significa que o Kernel só vai ativar o módulo caso seja necessário, esta opção otimiza o
sistema tornando o kernel do linux muito dinâmico.
Exemplo prático:
Digamos que você esteja usando uma impressora USB, neste momento o módulo para ela funcionar está
ativo no sistema. Depois de um tempo, você para de usar esta impressora por qualquer motivo, neste caso
o módulo de suporte a impressora não é mais necessário e você pode desabilitá-lo.
Ao executar o comando lsmod você pode visualizar quais módulos estão carregados atualmente na
memória:
# lsmod
Module Size Used by
fuse 98304 3
pci_stub 16384 1
vboxpci 24576 0
vboxnetadp 28672 0
vboxnetflt 28672 0
vboxdrv 454656 3 vboxnetadp,vboxnetflt,vboxpci
xfrm_user 36864 2
xfrm4_tunnel 16384 0
tunnel4 16384 1 xfrm4_tunnel
ipcomp 16384 0
xfrm_ipcomp 16384 1 ipcomp
esp4 20480 0
ah4 20480 0
af_key 36864 0
xfrm_algo 16384 5 xfrm_user,esp4,ah4,af_key,xfrm_ipcomp
snd_usb_audio 180224 2
uvcvideo 90112 0
snd_usbmidi_lib 28672 1 snd_usb_audio
snd_rawmidi 32768 1 snd_usbmidi_lib
videobuf2_vmalloc 16384 1 uvcvideo
videobuf2_memops 16384 1 videobuf2_vmalloc
videobuf2_v4l2 24576 1 uvcvideo
videobuf2_core 40960 2 uvcvideo,videobuf2_v4l2
wl 6365184 0
videodev 176128 3 uvcvideo,videobuf2_core,videobuf2_v4l2
media 40960 2 uvcvideo,videodev
snd_seq_device 16384 1 snd_rawmidi
arc4 16384 2
Cortei a saída acima, por que o meu kernel tem muitos módulos ativos. Estes módulos ativos são diferentes
de máquina para máquina, por causa que possuimos hardware e configurações diferentes. Durante a
instalação do Debian, o sistema verifica seu equipamento e define quais módulos vão estar ou não ativos
no seu sistema.
Os módulos possuem dependências, você pode saber a quantidade de dependências por módulos na
coluna used na saída do comando lsmod a coluna size mostra o tamanho do módulo em bytes. Um
módulo só pode ser removido se o número de dependências for zero.
Os módulos são carregados através do comando insmod. Se o módulo B depende do A, este deve ser
carregado antes. Digamos que na coluna used do módulo A agora esteja mostrando 1, referente ao módulo
B que você carregou. Não será possível remover o módulo A, neste caso, você deve remover sua
dependência B primeiro e só depois removê-lo.
A seguir vamos observar quais são os procedimentos para carregar o módulo vfat que dá suporte ao
sistema de arquivos FAT32, muito comum em pendrivers formatados no Microsoft Windows e depois
veremos como é o procedimento para sua remoção.
O primeiro passo é verificar se o módulo em questão, já não está ativo no sistema, para isto executamos:
Caso não obtenha nenhum retorno, significa, que o seu módulo não está ativo. Se tiver um retorno como:
vfat 20480 0
fat 69632 1 vfat
Significa que o seu módulo está ativo e funcionando. Para ativar um módulo, usamos a sintaxe:
# modprobe nome_do_modulo
Neste caso:
# modprobe vfat
Para saber informações sobre um módulo e ver suas dependências, utilize o comando modinfo, exemplo:
# modinfo vfat
filename: /lib/modules/4.9.0-deepin9-amd64/kernel/fs/fat/vfat.ko
author: Gordon Chaffee
description: VFAT filesystem support
license: GPL
alias: fs-vfat
depends: fat
intree: Y
vermagic: 4.9.0-deepin9-amd64 SMP preempt mod_unload modversions
Observe na saída acima, que a dependência para o vfat chama-se fat. Ao ativar o vfat vamos obter
novamente informação sobre ele:
Observe que fat tem na saída da coluna used o número 1. Tentaremos remover ele:
# rmmod fat
rmmod: ERROR: Module fat is in use by: vfat
Veja que foi impossível remover, já que ele está sendo usado por vfat. Então vamos remover o vfat
primeiro:
# rmmod vfat
O modo vfat foi removido com sucesso, mas ainda temos a dependência fat que precisa ser removida:
# rmmod fat
Para remover de modo automático um módulo e suas dependência, podemos usar o comando modprobe -
r exemplo:
# modprobe -r vfat
O bom neste caso é que além de remover o vfat ele também remove o fat sua dependência.
Para saber quais módulos estão disponíveis no seu sistema, acesse o diretório: /lib/modules/versao-do-
kernel/kernel no meu caso:
# cd /lib/modules/4.9.0-debian-amd64/kernel/
O meu kernel chama-se (4.9.0-debian-amd64) o seu provavelmente terá um nome diferente, já que este
Kernel que estou utilizando não é o padrão do Debian. Dentro deste diretório, você vai encontrar alguns
subdiretórios como:
Dentro de cada um deles você encontra os módulos. Observe o diretório fs - file system ele é o diretório
que contém módulos sobre sistema de arquivos, dentro deste diretório,você pode visualizar todos os
diretórios dos módulos disponíveis de fs:
# cd /lib/modules/4.9.0-debian-amd64/kernel/fs
# ls
9p befs ceph dlm ext4 fuse jbd2 minix
nilfs2 overlayfs reiserfs udf
adfs bfs cifs ecryptfs f2fs gfs2 jffs2 ncpfs
nls pstore romfs ufs
affs binfmt_misc.ko coda efivarfs fat hfs jfs nfs
ntfs qnx4 squashfs xfs
afs btrfs configfs efs freevxfs hfsplus lockd nfs_common
ocfs2 qnx6 sysv
autofs4 cachefiles crypto exofs fscache isofs mbcache.ko nfsd
omfs quota ubifs
No meu caso eu tenho diversos módulos de sistemas de arquivo, dentro do diretório do módulo de sua
escolha, você obtêm o nome do módulo, exemplo:
# cd /lib/modules/4.9.0-debian-amd64/kernel/fs/fat
# ls
# fat.ko msdos.ko vfat.ko
Compilando um kernel
As vezes algumas funcionalidades que necessitamos só estão disponíveis em uma versão mais nova do
kernel, por exemplo:
Recentemente eu comprei um controle de xbox para jogar alguns games no linux. Mas descobri através de
busca na internet, que o módulo para ativar este joystick só estava disponível na versão mais nova do
kernel, para isto, fui obrigado a compilar um kernel novo e não mais utilizar o padrão, oferecido pela
distribuição. O processo a seguir de compilação, serve para qualquer versão de kernel que desejar instalar.
O primeiro passo que realizei para compilar meu kernel novo, foi instalar as aplicações necessárias para o
processo de compilação:
http://www.kernel.org
A versão escolhida foi a última estável no momento da edição do livro: 4.12, segue o link:
https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.12.7.tar.xz
O terceiro passo é descompactar o Kernel que realizei download dentro do diretório /usr/src:
Após descompactar o quarto passo foi acessar o diretório e criar um link (atalho) para o diretório
descompactado linux-4.12.7:
# cd /usr/src
# ln -s linux-4.12.7 linux
Observe acima que criei um atalho chamado linux que aponta para linux-4.12.7, agora vamos acessar o
diretório linux e executar o comando para acessar o menu de configuração do kernel menuconfig:
# cd linux
# make menuconfig
Nesta janela de opções, você pode ativar novas funcionalidades para o kernel, por padrão, vamos apenas
salvar (save). Isto vai gerar um arquivo .config necessário para o resto do processo. Nesta quinta etapa,
devemos gerar a imagem do kernel propriamente dita, com o comando:
# make bzImage
Este processo demora um bom tempo, tenha paciência. No meu caso demorou umas três horas. O sexto
passo foi compilar os módulos, com o comando:
# make modules
Esta também é uma longa etapa, deu tempo de ver uns três episódios de "The Big Bang Theory". Agora o
sétimo passo é instalar os módulos no kernel novo:
# make modules_install
# make install
Como oitavo passo, vamos acessar o diretório /boot e gerar a imagem inicial do kernel intrd (de initial ram
disk).
BIOS --> MBR --> Bootloader (GRUB/lilo) --> Kernel --> Init
O boot loader que é o aplicativo de gestão de arranque de boot do linux, fica na MBR que o primeiro setor
de um disco:
O gerenciador de boot tem a função de carregar o sistema operacional na memória. Atualmente, o boot
loader padrão é o GRUB2 (Grand Unified Bootloader). O initrd/initramfs é um filesystem temporário que
carrega informações essenciais na memória RAM, como módulos para alguns dispositivos.
O INIT é o processo de ID 1 sendo o pai de todos os outros processos. Principais INITs utilizados:
# dmesg
Alterando os Runlevels, Shutdown e Reboot -
Tópico 101.3
A LPI menciona que devemos conhecer o SystemV e o Systemd. O SystemV trabalha com o conceito de
Runlevel que são níveis de execução do sistema. Cada Runlevel inicia o linux de uma maneira, vejamos uma
tabela sobre cada um deles:
No systemV temos um arquivo chamado /etc/inittab que é usado para se configurar o Runlevel padrão
(default), exemplo deste arquivo (com comentários):
#----------------------------------------------------------------------------------------
-----------------------#
# Entendimento dos níveis de execução no arquivo /etc/inittab #
#----------------------------------------------------------------------------------------
-----------------------#
#<identificação> : <Nível de EXecução> : <Ação> : <Processo> #
#----------------------------------------------------------------------------------------
-----------------------#
# Identificação: É a identifcação do nível de execução #
# Nível de Execução: Os níveis válidos de 0 á 6 #
# Ação: É ação que será feita caso o nível seja ligado (executado) #
# Processo: Processo gerado pela execução do nível de execução #
#----------------------------------------------------------------------------------------
-----------------------#
#----------------------------------------------------------------------------------------
-----------------------#
# Descrição do que cada nível de execução faz quando executado e de como colocar
#
# scripts e serviços na inicialização do sistema. OBS: a descrição dos runlevels
foi customizao #
#----------------------------------------------------------------------------------------
-----------------------#
# Os serviços ou scripts de inicialização devem ser colocados no diretório
/etc/init.d #
# para ser incluso em algum nível de execução. #
#----------------------------------------------------------------------------------------
-----------------------#
# <Níveis de execução> <Diretório> <Descrição do que é feito quando executado>
#
#----------------------------------------------------------------------------------------
-----------------------#
# 0 /etc/rc0.d/ modo de desligamento. para todos os serviços e desliga a máquina
#
#----------------------------------------------------------------------------------------
-----------------------#
# Modo de manutenção (single user). usado em casos criticos. #
# 1 /etc/rc1.d como por exemplo recuperar senha do root ou dá manutenção no
sistema. #
# Apenas o usuário root pode executar nesse nível #
#----------------------------------------------------------------------------------------
-----------------------#
# S /etc/rcS.d/ Carrega os serviços essenciais para o sistema, modo similiar ao
"1". #
#----------------------------------------------------------------------------------------
-----------------------#
# Modo multiusuário, usado para rodar o sistema básico sem serviços rede,
#
# 2 /etc/rc2.d e roda em modo texto. uso para fazer update do sistema #
# ou atualizações em massa. #
#----------------------------------------------------------------------------------------
-----------------------#
# 3 /etc/rc3.d/ Modo multiusuário, roda em modo texto com serviços de rede
disponiveis. #
# como samba, ssh e etc. #
#----------------------------------------------------------------------------------------
-----------------------#
# 4 /etc/rc4.d/ Esse nível de execução por padrão não é usado em distros debian
e RedHat#
# Mas uso como multiusuário em modo gráfico sem sem serviços de rede. #
#----------------------------------------------------------------------------------------
-----------------------#
# 5 /etc/rc5.d Modo multiusuário,usado para rodar o ambiente gráfico junto com
serviços#
# redes. #
#----------------------------------------------------------------------------------------
-----------------------#
# 6 /etc/rc6.d/ Modo de reinicialização do sistema. todos os serviços são paados
#
# e a máquina e reiniciada. #
#----------------------------------------------------------------------------------------
-----------------------#
###### indica o nível de execução padrão que o sistema irá usar ######
id:5:initdefault:
#### Localização de cada dos serviços e scripts a serem iniciados para cada nível de
execução ####
l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
Em distros com SystemD este aquivo não existe. Para o exame LPIC é necessário saber os níveis de
execução (Tabela) e saber que é no arquivo /etc/inittab através da linha: id:5:initdefault: que eu altero
este nível de execução. O diretório /etc/init.d possui os scripts de inicialização dos serviços. A nível de
compatibilidade o systemD e o upstart mantêm os diretórios: /etc/rc0.d , /etc/rc1.d , /etc/rc2.d e etc...
Que simboliza os runlevels.
# runlevel
Tanto init quando telinit tem a mesma função. No systemD temos os comandos runlevel, init e telinit para
questão de compatibilidade.
SystemD
O systemD utiliza o conceito de units ao invés de runlevel. Entre as melhorias está a paralelização, uso do
dbus entre outros. Os tipos de serviços são:
1. Service
2. Socket
3. Device
4. Mount
5. Automount
6. Target - Equivale ao runlevel
7. Snapchat
Para o exame não é necessário compreender em detalhes cada um dos serviços. Os mais importantes são:
Service e target. Assim como no systemV temos o runlevel padrão, no systemD temos um target padrão.
O diretório principal é o /lib/systemd/system, execute um ls -l para ver os arquivos de configuração das
units.
Comandos do systemD
O primeiro passo é verificar se você utiliza o sistema SystemD, para isto, execute o comando:
# ls -l /sbin/init
# systemctl list-units
As unidades são as configurações que estão em /lib/systemd/system. Para reiniciar a máquina ou desligar
usamos:
# systemctl reboot
# systemctl poweroff
Também podemos definir o target padrão. Para ver o target atual (semelhante ao runlevel) usamos:
# systemctl get-default
rescue.target seria semelhante ao init 1 do systemV. Para iniciar o target padrão definido no sistema:
# systemctl default
Temos 2 runlevels especificos para desligar e reiniciar, temos o runlevel 0 que desliga e o runlevel 6 que
reinicia. Mas existe uma forma melhor de fazer isto, usando o comando shutdown.
Se você usar o comando shutdown sem nenhum parâmetro o sistema será desligado daqui a 1 minuto,
mas é possível cancelar usando o comando shutdown -c, exemplo:
# shutdown
# shutdown -c
Para reiniciar :
# shutdown -r
Para desligar o linux e não desligar a máquina (ou seja a fonte de energia) usamos:
# shutdown -h
# shutdown 18:00
# shutdown -r +10
# shutdown -h +10
Outro comando que pode ser cobrado no exame é o comando wall ele serve para enviar mensagem para
todos os usuários do sistema, exemplo:
Tópico 102
Este é o tópico 102.1 que fala sobre o Desing do Layout do HD. A prova nao tem só comandos, ela também
aborda conceitos. Por isto é importante ficar atento aos conteúdos teóricos do curso.
Sistemas de particionamento
O MBR é o sistema de particionamento mais comum, mas ele tem a limitação de 2TB por partição. Sistemas
que utilizam EFI já estão atuando com o GPT. Para a certificação linux, vamos trabalhar com MBR.
É possível uma instalação com apenas 1 partição que vai ter o ponto de montagem raíz (/), no entanto,
recomenda-se pelo menos 2 partições:
A área de SWAP é um espaço no disco que simula a memória RAM e é utilizada quando o espaço total da
RAM é usado. Outra maneira de organizar o nosso disco é usando o LVM - Logical Volume Manager.
Arquivo de swap
No detalhe acima os 512MB já foram somados aos que já existiam, então para tornar as mudanças
definitivas, ou seja, para que essa SWAP esteja disponível para uso do sistema a cada reinicialização,
adicionaremos uma entrada no arquivo /etc/fstab assim:
# free -h
Provavelmente não teremos nenhum (se não instalamos o sistema usando lvm).
pvcreate /dev/sdb1
pvcreate /dev/sdb2
pvcreate /dev/sdb3
pvdisplay
Agora vamos pegar estes (dispositivos) e fazer uma grande massa dedados.
Vamos verificar:
vgdisplay -vstorage
Agora vamos criar um volume lógico dizendo de qual massa de dadosvamos pegar o espaço.
lvdisplay
Podemos visualizar em nosso volume group que estamos usando 3G em umvolume lógico.
vgdisplay -vstorage
Agora, digamos que eu desejo adicionar mais um dispositivo (partição,raid) ao meu volume group. Neste
caso, vamos usar nosso /dev/sdb3,para isto fazemos:
Visualize agora:
vgdisplay -vstorage
mkfs.ext4 /dev/storage/lv_storage
df -h
Digamosagora que ele estourouo espaço e precisamos ampliar o seu tamanho. Oprimeiro passo é
desmonstar.
umount /mnt/storage
lvextend -L +2G/dev/storage/lv_storage
Se dermos um (lvdisplay) você vai observar que agora temos 5GB e nãomais 3GB.
Mas mesmo assim, o file system (quando formatamos) era de 3G, poristo ele não atualiza quando você
digita :
df -h
Então,temos que mostrar para ele que o disco cresceu. Masantes é necessário executar a verificação do
disco:
e2fsck -f /dev/storage/lv_storage
resize2fs /dev/storage/lv_storage
# df -h
Comandos essenciais
# df -h
# fdisk -l
Dentro do diretório /sys/block/sda ou o nome do disco que você tenha (sdb,sdc e etc...) você pode
também visualizar as partições.
# cd /sys/block/sda
# ls
/etc/default/grub Arquivo de configuração do menu do GRUB,lido pelos scripts do GRUB e então escrito
no grub.cfg.
Dentro do arquivo de configuração /etc/grub.d temos o arquivo 40_custom que é usado para criar
entradas para outros sistemas operacionais. O primeiro passo é dar permissão de execução:
# chmod +x 40_custom
Em seguida, criamos a entrada. No exemplo abaixo vamos adicionar uma entrada para o Windows que está
em um segunda HD (sdb), o resultado seria:
#!/bin/sh
exec tail -n +3 $0
Na tela de login tecle em seguida edite a linha deixando-a como no exemplo abaixo:
# mount -o remount,rw /
# passwd root
A biblioteca estática é incorporada na minha aplicação. A desvantagem é que o programa vai ficar maior,
por que quando eu compilar minha aplicação todas as bibliotecas necessárias vão estar dentro do código.
O modo mais inteligente é a biblioteca dinâmica, que faz apenas uma referência no código, a biblioteca vai
ser carregada apenas uma vez e serve para diversos aplicativos.
Comandos básicos
Para saber quais são as bibliotecas que uma aplicação está usando, o primeiro passo e descobrir o caminho
do executável:
# whereis vim.basic
# ldd /usr/bin/vim.basic
O linux através de um programa interno chamado "ld.so" consegue mapear o caminho das bibliotecas que
a aplicação necessita. O "ld.so" procura basicamente as bibliotecas em dois diretórios que são:
/lib
/usr/lib
/etc/ld.so.cache
/etc/ld.so.conf
O ld.so.cache é o arquivo que mapeia todas as bibliotecas conhecidas pelo linux e faz o vinculo com a
aplicação. O ld.so.conf é o arquivo principal de configuração, que aponta para o diretório ld.so.conf.d.
# ldconfig
Com a opção "-p" podemos visualizar todas as bibliotecas que estão reconhecidas no linux no momento:
# ldconfig -p | less
# mkdir /tmp/lib
E agora vou apontar este caminho para o meu "ld.so", abra o arquivo :
# vim /etc/ld.so.conf
E adicionar a linha:
/tmp/lib
Salve o arquivo e feche-o. Agora execute:
# ldconfig
# export LD_LIBRARY_PATH=/tmp/lib/
A certificação trabalha com o padrão Debian e o padrão RPM/Red Hat. Os comandos "base" para a
certificação é o dpkg, apt-get e rpm, yum.
O comando dpkg
Você pode visualizar que o dpkg tem uma série de opções com o comando:
# dpkg --help
Para ver a lista de programas instalados, use:
# dpkg -l
# dpkg -l bash
# dpkg --get-selections
# dpkg --get-selections | grep bash
Para exemplificar, vou realizar a instalação do shell KSH via dpkg. Primeiro passo realizei o download
(verifique sua versão de arquitetura):
# wget http://ftp.us.debian.org/debian/pool/main/k/ksh/ksh_93u+20120801-1_i386.deb
Para encontrar este link, eu pesquisei no google: "Download ksh debian package". Antes mesmo de realizar
a instalação deste pacote é possível visualizar os arquivos que o contém, para isto, utilize:
# dpkg -I ksh_93u+20120801-1_i386.deb
# dpkg -i ksh_93u+20120801-1_i386.deb
# dpkg -l ksh
Para ver a lista de arquivos usados por esta aplicação usamos a opção em maiúscula:
# dpkg -L ksh
Para saber a origem de um arquivo, ou seja, qual pacote ele pertence, podemos usar:
# dpkg -S /usr/share/menu/ksh
# dpkg -r ksh
Se você rodar:
# dpkg -l ksh
Vai observar que ele ainda mantém informações do pacote na base de dados. Porém ao executar:
Vai observar que o pacote não está instalado. Para remover o pacote e qualquer informação da base de
dados, usamos:
# dpkg -l ksh
Comandos do apt
O "apt" utiliza um repositório, com os endereços dos locais onde os pacotes serão encontrados. Este
repositório fica localizado em:
/etc/apt/sources.list
# apt-cache
Obseve que ele mostra algumas funções que podemos usar, como por exemplo a opção:
# apt-cache pkgnames
Esta opção mostra uma lista de pacotes instalados no sistema. Para ver detalhes de um pacote em especial,
usamos:
Para ver quais pacotes (dependências) o vim, por exemplo, precisa para funcionar, usamos:
O comando apt-get
Sua função é ler o arquivo de repositórios (/etc/apt/sources.list) e atualizar a base de dados, com as
informações mais recentes de atualizações dos repositórios. Assim, sempre que você solicitar a instalação
de um pacote, ele saberá exatamente onde procurar e qual a última versão disponível para a instalação.
Obs: O comando "apt-get update" não atualiza o sistema operacional, ele somente atualiza a lista de
programas disponíveis nos repositórios.
# apt-get upgrade
Este comando irá verificar e atualizar todos os pacotes disponíveis no seu sistema, buscando as versões
mais atualizadas no repositório. Outro método, é usando o comando:
# apt-get dist-upgrade
A diferença entre os dois, é que este atualiza a versão de sua distribuição, caso uma nova versão esteja
disponível nos repositórios.
Buscando um pacote
Digamos que você precisa de um editor, mas não sabe o nome de nenhum para realizar sua instalação.
Uma maneira de procurar por todos os editores disponíveis no repositório é usando o comando:
Neste caso você terá uma lista com todos os pacotes que tenha a "string" editor. Quando encontrar um que
seja adequado, instale-o usando o comando:
Instalar mais de um pacote de uma vez também é possível, basta dar um espaço em cada um deles:
Para remover o pacote, removendo também informações da base de dados e arquivos de configurações:
Uma opção que poucos conhecem é a possibilidade de se fazer apenas o download do pacote .deb, mas
não realizar sua instalação. Para isto, você pode usar o comando:
O Download do pacote é realizado dentro do diretório: /var/cache/apt/archives. Toda vez que você instala
um pacote o arquivo de download fica neste diretório. Para limpar este cache, você pode usar o comando:
# apt-get clean
Comando dpkg-reconfigure
Este comando é utilizado para alguns pacotes que permitem interação com o usuário, como timezone,
definição de programas padrão, modelo de teclado entre outros. Este comando permite, refazer a
configuração deste pacote, exemplo:
# dpkg-reconfigure tzdata
# dpkg-reconfigure keyboard-configuration
Comando dselect
O comando dselect não é padrão na maioria das distros. Ele é uma interface para o comando apt, através
de menus interativos.
# dselect
Comando aptitude
O aptitude também tem uma interface de menu, mais complexa do que a do dselect:
# aptitude
Atualizar distro:
# aptitude safe-upgrade
Pesquisar pacote:
Instalar um pacote:
Remover um pacote:
O aplicativo alien
O Alien é um aplicativo que permite a conversão de pacotes .deb para .rpm entre outros formatos. Vale
lembrar que não é recomendável a utilização de pacotes que não são nativos a sua distribuição.
# alien -r nome_do_pacote.deb
# alien pacote.rpm
O comando rpm é equivalente ao dpkg do debian. Para verificarmos todos os pacotes instalados na
máquina, usamos:
# rpm -qa
E os arquivos de documentação:
Para você verificar um arquivo e saber quem é o pacote dono deste arquivo, utilize:
Para os próximos exemplos, vamos necessitar de um pacote .rpm. Para isto, podemos usar comando "yum"
que é semelhante ao "apt-get" com a opção de apenas fazer o download de um pacote sem instalar o
mesmo:
No exemplo acima, estou fazendo download do pacote "zsh" dentro do diretório: /tmp/programa.
Agora que temos o pacote "zsh.... rpm" dentro do diretório /tmp/programa, vamos visualizar suas
informações:
# rpm -i zsh...rpm
Caso você já tenha um pacote instalado e deseja instalar uma nova versão que você fez download, use a
opção:
# rpm -U nome_do_pacote.rpm
Algumas opções interessantes a usar durante a instalação é colocar os detalhes e uma barra de progresso:
O comando "rpm" não resolve dependências de pacotes. Quando um pacote possui dependências o rpm
não instala este pacote. Existe uma forma de você instalar um pacote, ignorando as dependências, isto é
arriscado, por que sua aplicação pode não funcionar corretamente.
Neste caso, ele força a instalação, ignorando dependências e/ou outros erros que poderiam ocorrer na
instalação normal. Também não é uma opção indicada. Antes de instalar um pacote é possível fazer um
teste para saber se o mesmo vai se instalar corretamente em meu sistema. Como informei, isto será um
teste, o pacote não vai ser instalado de fato.
# rpm -e zsh
O yum possui também um recurso de busca, que é bastante útil quando você está procurando por um
pacote, mas não sabe o nome exato, ou em casos de pacotes que possuem nomes diferentes em relação a
outras distribuições. Use o comando "yum search", seguido por alguma palavra ou expressão, que faça
parte do nome do pacote ou descrição, como em:
Ele é bem menos falador, retornando apenas os pacotes que possuem "httpd" no nome, sem pesquisar nas
descrições.
Uma terceira opção é a "provides" que mostra pacotes que incluem um determinado arquivo, pesquisando
não no nome ou na descrição, mas sim no conteúdo dos pacotes. Ele é bastante útil em casos em que você
precisa de alguma ferramenta ou biblioteca que faz parte de outro pacote maior, como em:
Em caso de dúvida, você pode verificar se um determinado pacote está instalado e qual é a versão usando
o comando "rpm -q", como em:
# rpm -q samba
samba-3.0.25b-0.el5.4
Para atualizar um pacote já instalado, use o comando "yum update", como em:
O comando "yum install" também pode ser usado para atualizar pacotes. A diferença entre o "install" e o
"update" é que o "update" se limita a atualizar pacotes já instalados. Ao perceber que o pacote solicitado
não está instalado, ele exibe um aviso e aborta a instalação, como no exemplo abaixo. Isso reduz a
possibilidade de você acabar instalando um novo serviço por engano:
Loading "installonlyn" plugin Setting up Update Process Setting up repositories Reading repository
metadata in from local files Could not find update match for mysql-server
Outra observação é que, depois de atualizar um serviço, é necessário recarregar o serviço (como em
"service smb restart") para que a nova versão passe a ser usada. Esta é mais uma pequena diferença com
relação às distribuições derivadas do Debian, onde os serviços são reiniciados de forma automática depois
de atualizados.
Para atualizar todo o sistema, comece usando o parâmetro "check-update", que lista as atualizações
disponíveis:
# yum check-update
Se usado sem especificar um pacote, o "update" vai atualizar de uma vez só todos os pacotes do sistema,
de forma similar ao "apt-get upgrade" do Debian:
# yum update
Existe ainda o comando "yum upgrade", que é um pouco mais incisivo, incluindo também pacotes
marcados como obsoletos (que não existem mais na versão atual). Ele é útil em casos em que é necessário
atualizar uma versão antiga do sistema:
# yum upgrade
É possível também fazer com que o yum atualize o sistema automaticamente todas as madrugadas. Para
isso, basta ativar o serviço "yum" e configurá-lo para ser ativado durante o boot:
Isso faz com que a atualização seja agendada através do cron e seja (por padrão) executada todos os dias
às 4:02 da manhã, como especificado no arquivo "/etc/crontab".
# fdisk -l
# fdisk /dev/sdb
Onde "sdb" é o disco que utilizaremos para a criação das partições. Dentro do utilitário "fdisk", podemos
apertar a tecla < m > para visualizar o help e ver a teclas básicas de navegação dentro do fdisk.
Para criar uma nova partição, apertamos a tecla < n > , na primeira etapa, escolha o tipo de partição entre
primária (tecla p) e extendida (tecla e), já estuamos isto no tópico 102. Após escolher o tipo, você deverá
escolher o número da partição, recomendo que escolha o padrão ( enter ).
A outra etapa é para escolher o "First sector" ou seja, o setor que vai iniciar a partição, também escolha o
padrão ( enter ). O "Last sector" ou último setor, é a opção para você definir o tamanho de sua partição. O o
padrão é colocar o sinal de adição com o valor em (K)ilobyte, (M)egabyte, (G)igabyte e etc... exemplo:
+5G
Neste exemplo, estou definindo em 5Gb. Estas alterações só vão ser gravadas no disco, quando usarmos a
opção < w > que irá salvar e fechar o utilitário fdisk.
Agora que salvamos e fechamos o fdisk, devemos formatar esta partição, ou seja, aplicar um sistema de
arquivos, para isto, usaremos o padrão ext4:
# mkfs.ext4 /dev/sdb1
O utilitário (mkfs) é o responsável de aplicar o sistema de arquivos. Ao digitar "mkfs" tecle < tab > para ver
as opções disponíveis em seu sistema. Você pode formatar discos em NTFS, FAT32, Ext2,3,4 entre outros
formatos.
Journal é como se fosse um log de registros do que está acontecendo com o disco em tempo real, em caso
de uma queda abrupta de energia, ele consegue recuperar melhor as informações do disco, evitando
falhas. Sistemas modernos, utilizam Journal.
Antes de acessarmos esta partição, vamos abrir novamente o utilitário fdisk e apagar a partição:
# fdisk /dev/sdb
A tecla para remover uma partição é < d > . Se você tiver apenas uma partição ela será removida, se tiver
mais de uma, deverá colocar o número da partição a ser removida, após teclar < d >.
Agora que já aprendeu a remover a partição, crie novas partições e aplique o sistema de arquivos ext4.
# df
# df -h
Esta opção é útil por que mostra o tamanho em "Mb, Gb, e etc...". Outra opção interessante é a de se ver o
tipo de sistema de arquivos que a partição foi formatada:
# df -hT
Eu também posso visualizar as partições que eu tenho montada com um tipo de sistema de arquivos:
# df -ht ext4
Creio que você já deve ter se perguntado, porque o meu pendrive de 1.5G mostra disponível apenas 1.38G,
ou mais, o meu recém adquirido HD de 80G me disponibiliza um pouco menos, por volta de 78G, ou
mesmo um disquete de 1.44M mas só dispõe 1.36M. Afinal, pra onde foram esses bytes que na hora de
venda anunciam, mas quando eu vou usar, não estão disponíveis?
Calma, esses bytes não sumiram e muito menos você foi enganado pelo vendedor, fazendo propaganda
enganosa. Esse espaço "invisível" é reservado para um tipo especial de estrutura de dados chamado INODE.
Essa estrutura é responsável por conter informações básicas sobre seus arquivos e pastas, como
permissões de acesso, identificação dos donos dos arquivos, data e hora do último acesso e alterações,
tamanho e o mais importante, os famosos ponteiros para o arquivo em si. De modo geral, o INODE é a
identidade de um arquivo ou diretório, é uma identificação única para ele.
Ao ler qualquer arquivo ou diretório, o kernel trata de ler primeiramente o INODE do arquivo para depois
chegar o dito cujo. Ao ler essa estrutura, são checadas as permissões e em caso de negada é retornada a
famosa mensagem de "Permission denied", caso contrário o procedimento segue normalmente.
# ls -li
Pode acontecer de você ainda ter um pequeno espaço no disco, mas não conseguir mais gravar
informações no diso, por falta de inode. Para verificar, execute:
# df -i
O comando "du" mostra quanto espaço está sendo utilizado por cada diretório.
# du
# du -a
# du -ah
# du -hs *
Ou especificando um diretório:
# du -hs /home
Para limitar a quantidade de subdiretórios que o comando vai se aprofundar, podemos usar:
# du -h --max-depth=2
Observação: O fsck só funciona quando a partição não esta montada, ou se ela estiver somente leitura.
O "fsck" tem variações para outros sistemas de arquivos, além do ext4 padrão do linux, você pode verificar
as disponibilidades usando o comando:
# ls -l /sbin/fsck*
# fsck.ext4 /dev/sdb2
Comando dumpe2fs
Para obter informações sobre uma determinada partição, usamos o comando "dumpe2fs", exemplo:
# dumpe2fs /dev/sda1 -h
Com este comando podemos visualizar diversas informações sobre a partição. Uma informação
interessante é "Reserved Block Count" que mostra quanto espaço da partição está reservado para não ser
usado, o padrão em média é 5%.
Partições xfs
Para partições "xfs" podemos obter informações usando:
# xfc_info /dev/sc1
Para gerar um dump com informações da partição e gerar um arquivo, podemo usar:
# dumpe2fs /dev/sdb1
# tune2fs -i 1m /dev/sda1
No exemplo acima, defini que a checagem irá ocorrer a cada 1 mês. Para habilitar o "journal" em uma
partição que não tem journal, eu uso:
# tune2fs -j /dev/sdb4
Neste caso ele transforma uma partição sem journal (ext2) em uma com journal (ext3).
# df -h
Ou através do comando:
# mount
clePara montarmos uma partição de forma temporária (perde no reboot da máquina) usamos os comandos
mount/umount, para que a partição esteja disponível após o reboot, devemos editar o arquivo: /etc/fstab.
Para montarmos todas as partições que estão no arquivo "/etc/fstab" usamos o comando:
# mount -a
Para desmontar todas as partições que estejam no arquivo "/etc/fstab" mas que não estão em uso, usamos:
# umount -a
# mkdir /mnt/sdb1
Obseve, que criei o diretório com o mesmo nome da partição que irei associar (montar), mas isto é somente
para facilitar, poderia criar este diretório com qualquer nome. Aliás, é possível montar em qualquer
diretório, criei em /mnt para seguir um padrão.
Agora que já tenho o diretório vou executar o comando para montar a partição:
# umount /dev/sdb1
Ou
# umount /mnt/sdb1
Fstab
Abra o arquivo fstab com o seu editor de texto de preferência:
# vim /etc/fstab
A primeira coluna (/dev/cdrom) corresponde ao hardware que queremos montar. A segunda coluna
significa o lugar que queremos montar (lugar que aparecerá o seu conteúdo) o hardware, no caso, o cdrom
(/media/cdrom). Na terceira coluna (auto) começa a complicar um pouco.
auto
Essa opção se refere ao sistema de arquivos da unidade. Se ela é ext3, ext4, ntfs, etc. Recomendável deixar
a opção auto, que o sistema de arquivos será detectado automaticamente. Em seguida teremos a quarta
coluna (ro,noauto,user,exec). Ela é composta de valores em sequência e sem espaço entre elas. Vamos
tentar entender o que significa esses valores.
ro e rw
Com a opção automática (auto), o dispositivo será montado automaticamente (na inicialização). auto é a
opção padrão. Se você não quer que o dispositivo seja montado automaticamente, use a opção noauto.
Com noauto, o dispositivo pode ser montado apenas manualmente.
user e nouser
Estas são opções muito úteis. A opção do usuário (user) permite que os usuários normais montem o
dispositivo, ao passo que nouser permite apenas ao root montar o dispositivo. nouser é o padrão, que é
uma das principais causas de dor de cabeça para os novos usuários Linux. Se você não é capaz de montar o
seu cdrom, disquete, partição do Windows, ou algo como um usuário normal, adicione a opção do usuário
no /etc/fstab.
exec e noexec
exec permite executar binários que estão nessa partição, enquanto noexec não permite que você faça isso.
noexec pode ser útil para uma partição que contém os binários que você não deseja executar no seu
sistema, ou que nem sequer pode ser executado em seu sistema. Este poderia ser o caso de uma partição
Windows. exec é a opção padrão, que é uma coisa boa. Imagine o que aconteceria se você acidentalmente
utilizar a opção noexec com sua partição raiz do Linux…
sync e async
Como a entrada e saída para o sistema de arquivos deve ser feito. sync significa que é feito de forma
síncrona. Se você olhar para o fstab da unidade de disquete, você vai perceber que esta é a opção utilizada.
Significa que quando você, por exemplo, copiar um arquivo para o disquete, as alterações são gravadas no
disquete, no mesmo tempo que você emitir o comando de cópia. No entanto, se você tem a opção async
em /etc/fstab, entrada e saída são feitas de forma assíncrona. Agora, quando você copiar um arquivo para o
disquete, as alterações podem ser fisicamente gravadas muito tempo depois de emitir o comando. Isso não
é ruim, e pode ser favorável, mas pode causar alguns acidentes desagradáveis: se você acabou de remover
o disquete sem desmontar primeiro, o arquivo copiado pode não existir fisicamente no disquete ainda!
async é o padrão. No entanto, use a sincronização com o disquete, especialmente se você está acostumado
ao modo como ele é feito no Windows e tem uma tendência a retirar os disquetes antes de desmontar
primeiro.
Você pode ainda ao invés de usar todas essas variáveis, utilizar uma opção que reúne todas as opções
padrão na quarta coluna.
defaults
Na quinta coluna, temos um número que pode ser 0 ou 1. Se 0, a unidade não será checada pela análise de
sistema de arquivos do Linux rotineiramente. A sexta coluna, é apenas a ordem em que será verificado o
sistema de arquivos. Se 1, será o primeiro. Se 2, será a segunda unidade a ser verificada.
Instalando no Debian: apt-get install quota Instalando no Centos: yum install quota
Poderia ser a partição /home - desde que ela estivesse separada no arquivo:
/etc/fstab
# mount
Onde:
Criar arquivos de quota u Checa quota dos usuários g Checa quota dos grupos
aquota.group e aquota.user
# quotaon /mnt/sdb1
# quotaoff /mnt/sdb1
# repquota -va
# edquota -u nome_do_usuário
Hard limite máximo, após exceder esta quota, ele fica no "grace time" devendo remover em um
determinado tempo arquivos.
Comando:
edquota -t
Um arquivo no linux pertence a um usuário, normalmente o usuário que o crio e um grupo dono ou
associado a este arquivo. Um arquivo como na imagem acima, tem 12 bits com as informações das
permissões deste arquivo.
Estes bits são divididos em 4 grupos. Sendo os primeiros 3 bits para configurações de permissões especiais,
que veremos mais a frente, os próximos 3 bits, configurações de permissões do usuário, os 3 outros,
configurações do grupo do arquivo e os bits finais, configurações das permissões para outros usuários.
Cada arquivo no sistema possui três permissões básicas:
r (4) read - para leitura; w (2) write - para escrita; x (1) execute - para execução;
A cada permissão é atribuído um valor, mostrado entre parênteses, que será utilizado para a definição de
permissões. Além disso, cada arquivo contém três conjuntos de permissões, sendo elas:
Sendo assim, considere a seguinte saída do comando ls -l, para um arquivo: permis- são do arquivo:
Vamos entender o que essas linhas significam. O primeiro caractere pode ser:
“-” -> indicando a listagem de um arquivo comum”; d -> indicando um diretório; l -> indicando um “link”
simbólico; p -> indicando um “pipe” nomeado; s -> indicando um “socket”; c -> indicando um dispositivo de
caractere; b -> indicando um dispositivo de bloco.
Os próximos três conjuntos de três caracteres indicam as permissões do usuário dono do arquivo,
permissões de grupo e permissões para outros usuários. Nesses três conjuntos, se o caractere encontrado
for um “-” (hífen) significa que a permissão está ausente, ou seja, não há a respectiva permissão. Se alguma
ou todas as letras (r, w e x) forem encontradas, indicará as permissões que o arquivo tem permissões
definidas.
Seguindo o conjunto de permissões, há um número que indica a quantidade de “links” simbólicos que o
arquivo ou diretório tem. Após o número de “links”, vem a indicação do usuário dono do arquivo, seguido
do grupo ao qual ele, o arquivo ou diretório, pertence.
Crie um usuário chamado aluno, que terá um grupo padrão também definido como aluno. Vamos criar um
diretório para testes e criar um arquivo dentro, se logue como usuário aluno:
$ ls -l / tmp / arquivo
-rw -r --r - - 1 aluno aluno 0 2011 -11 -04 12:17 arquivo
Sua permissão para o dono é Leitura e escrita: **r w -** Sua permissão para grupo é Somente leitura: **r -
-** Sua permissão para outros é Somente leitura: **r--**
Permissão Literal
O comando que usamos para alterar os valores das permissões é o "chmod". Observe :
O parâmetro “u-rw” é que define o esquema de permissões. A primeira letra indica para qual(is) usuário(s)
as permissões estão sendo alteradas. Usamos a letra “u” para indicar o próprio dono, “g” para indicar o
grupo, “o” para outros e ainda a letra “a” para indicar todos.
O caractere seguinte poderá ser um sinal de “=” para deixar a permissão igual à que se deseja, “+” para
garantir a permissão ou “-” para retirar a permissão. Por fim, detalhamos a permissão: A letra “r” significa
leitura, “w” escrita e “x” execução, como era de se esperar.
Assim, o exemplo anterior retira as permissões de leitura e escrita para o usuário dono do arquivo.
Verifique novamente a permissão do arquivo:
$ ls -l / tmp / arquivo
----r --r - - 1 aluno aluno 0 2011 -11 -04 12:17 arquivo
Sua permissão para o dono é Nenhuma: **- - -** Sua permissão para grupo é Somente leitura: **r - -** Sua
permissão para outros é Somente leitura: **r - -**
As permissões seguem uma ordem dono, grupo, outros, ou seja, se você é o dono as permissões que se
encaixam no seu perfil é a de dono, mesmo que você pertença ao grupo, as permissões de dono
prevalecem.
Será possível por que a permissão outros possui permissão de leitura. As permissões de grupo permitem
que ele abra o arquivo para leitura, mas não para escrita:
$ chmod g + w arquivo
Este comando adiciona a permissão de escrita para os usuários que fazem parte do mesmo grupo ao qual
o arquivo pertence. As demais permissões não são altera-das.
$ ls -l / tmp / diretorio
$ cd / tmp / diretorio
Para que os usuários acessem um diretório, ele precisa ter, permissão de execução. Vamos remover a
permissão de execução de todos os diretórios:
$ cd ..
$ chmod a - x / tmp / diretorio
Agora tente acessar o diretório:
$ cd / tmp / diretorio
Não é possível isso porque o x é o responsável por dar acessos ao diretório, mas ainda é possível visualizar
o conteúdo do diretório:
$ ls / tmp / diretorio
Permissão octal
A segunda sintaxe é a forma numérica. Neste caso, o parâmetro que define as permissões é composto de
três números de 0 a 7, que correspondem às permissões para o usuário dono, para o grupo e para outros.
Cada número é formado pela soma das permissões atribuídas, sendo que execução vale 1, escrita vale 2 e
leitura 4.
Vejamos um exemplo:
Neste caso, estamos atribuindo a permissão de: leitura e escrita 6 (r=4 + w=2) ao usuário dono leitura 4
(r=4) ao grupo 0 (sem permissões) à outros usuários. É importante observar que quando usamos a forma
literal, alteramos apenas o pa-râmetro especificado, não alterando as demais permissões. Já na forma
numérica, alteramos todas as permissões simultaneamente.
Exemplos de permissões Comando para atribuir permissão total a um arquivo chamado naofazer:
Ou
Verifique a permissão:
# ls -l / tmp / naofazer
- rwxrwxrwx 1 root root 0 2011 -11 -06 22:17 naofazer
Evite dar permissão total para um arquivo ou diretório a não ser que seja realmente preciso. Não se deve
fazer isso em nenhum tipo de arquivo, isso é apenas um exem-plo!!!
Comando para retirar a permissão de escrita de todos os usuários do arquivo “nao- fazer”:
Visualize:
# ls -l / tmp / naofazer
Comando para alterar a permissão padrão do arquivo “arquivo” para que todos os usuários apenas possam
lê-lo.
Visualize:
# ls -l / tmp / naofazer
Utilizando o exemplo anterior do modo Literal, vamos alterar a permissão recursiva- mente, dando
permissão total somente para o dono:
ANTES:
DEPOIS:
drwx ----- - 2 aluno aluno 4096 2011 -11 -04 17:02 diretorio /
###Umask
O “umask” altera o valor da máscara de criação de arquivos e diretórios. Essa “máscara” é utilizada para
definir o “permissionamento” padrão de um arquivo ou diretório quando ele é criado. Para calcular a
“umask” para um diretório, pegue a permissão total que um diretório pode chegar, “777”. Subtraia “022” de
“777” (esse é o valor padrão de “umask” do sistema).
Para calcular a “umask” para um arquivo, pegue a permissão total que um objeto pode chegar, que é “777”.
Subtraia “111” de “777” (valores de execução do arquivo) e de “0022” (valor padrão de “umask” do sistema
no Debian).
O valor padr ã o da " umask " fica armazenada no arquivo " / etc / profile". Caso não exista adicione umask:
O primeiro " 0 " significa modo octal , pode - se passar o valor em hexadecimal colocando " 0 x " como
prefixo .
Permissões Especiais
Há um conjunto especial de permissões, conhecido também como “bits” especiais, sendo eles:
O “SUID bit” é atribuído a um arquivo binário com permissão de execução, quando desejamos que um
usuário qualquer execute o comando com as permissões do usuário dono do comando. Se esse comando
pertencer ao usuário “root” um usuário qualquer irá executá-lo com as permissões de “root” desde que
tenha permissões para executá-lo. Por esse motivo o “SUID” constitui uma grande ameaça de segu- rança e
sua utilização deve ser bastante cautelosa.
O “SGID bit” é geralmente atribuível a diretórios. Quando um arquivo é criado dentro de um diretório com
“SGID bit” ativado, o conteúdo gravado dentro do diretório irá herdar o grupo do diretório e não o grupo do
usuário que criou tal conteúdo. Este “bit” especial é muito útil quando utilizamos diretórios para grupos de
trabalhos e em servidores de arquivos.
O “Sitcky bit” era bastante utilizado para realizar otimizações de acesso a conteú-dos, entretanto, a partir
da série 2.6 do kernel do Linux essa tarefa é realizada dire-tamente pelo kernel. A única utilidade desse
“bit”, atualmente, é fazer diretórios de utilização comum a todos os usuários, como no “/tmp”. Quando esse
“bit” está ativo em um diretório, todo conteúdo criado dentro dele pertencerá ao criador do conteúdo e por
mais que ele atribua a esse conteúdo permissões totais para todos os usuários, o único que poderá excluir
o arquivo ou diretório será o próprio dono ou o “root” ou ainda o dono do diretório que tem a permissão.
Para atribuirmos esses “bits” especi-ais, procedemos da mesma forma que nas permissões comuns,
somando os valores e utilizando o comando “chmod”, mas agora utilizando quatro números, o primeiro
número sendo o “bit” especial, seguido dos três da permissão padrão.
O “bit” especial para o campo de permissões do dono é o “SUID” representado por “s” ou “S”. Para o grupo é
“SGID” também representado por “s” ou “S”. Já o campo de permissões de outros usuários, o “Sticky BIT”, é
representado por “t” ou “T”.
Veja que quando o arquivo ou diretório não tem permissão de execução, o “bit” especial é representado por
uma letra “S” (Upper Case), e quando possuem uma permissão de execução, o “bit” especial é apresentado
como “s” (Lower Case). O mesmo acontece com o “Sticky bit”, mas com a letra “t” e “T”.
# ls -l
---s ----- - 1 root root 0 2008 -07 -21 13:50 a
------s -- - 1 root root 0 2008 -07 -21 13:50 b
---------t 1 root root aluno 0 2008 -07 -21 13:50 c
Todas as permissões especias que não contiverem execução são maiúsculas. “S” e “T”.
Os nossos usuários comuns só podem mudar sua senha pois o comando passwd está com o “bit SUID”
ativado.
Desabilite o Suid:
$ passwd
Não é possível, pois o aluno não tem permissão de escrita nos arquivos /etc / passwd e / etc / shadow .
Como root, volte a permissão original: # chmod 4755 / usr / bin / passwd
SGID Bit: Crie um diretório com permissão total para qualquer usuário:
# mkdir / teste
# chmod 777 / teste
Agora qualquer usuário tem acesso ao diretório teste. Como usuário aluno crie um arquivo no diretório
teste:
$ ls -l / teste
Verifique que o grupo é o mesmo do usuário. Agora como root altere a permissão do diretório teste,
adicionando o SGID Bit:
Novamente como usuário aluno, crie um novo arquivo dentro do diretório teste:
Visualize que o grupo agora não é mais o do usuário e sim o mesmo do diretório.
Stick Bit: Como root modifique novamente a permissão do diretório teste, adicone o Stick Bit:
Agora modifique as permissões dos arquivos dentro dele dando permissão total para todos os usuários:
Agora se logue como usuário aluno2, visualize as permissões do diretório e dos arquivos:
$ ls -ld / teste
drwxrwsrwt 2 root root 4096 2011 -11 -07 11:19 / teste
$ ls -l / teste
- rwxrwxrwx 1 aluno aluno 0 2011 -11 -07 11:01 / teste / numero1
- rwxrwxrwx 1 aluno aluno 0 2011 -11 -07 11:19 / teste / numero2
Agora que você viu que tem permissão total nos arquivos, tente deletar algum arquivo dentro do diretório
teste:
$ rm / teste / numero1
Apesar da permissão total no arquivo, não é possível remover devido a permissão do diretório com Stick
Bit.
O comando para trocar as permissões é o chmod. Há duas sintaxes possíveis: literal e octal.
Neste caso o dono do arquivo, será luizinho. Para alterar o nome do usuário e do grupo, usamos:
Neste exemplo, o grupo foi alterado para financeiro. Para trocar somente o grupo, usamos:
Troquei de financeiro para admin, suprimindo o nome do usuário à frente dos : (dois pontos).
Neste caso ele alterou o usuário do diretório2 para juliano e o grupo para financeiro, tanto do diretório2
quanto dos subdiretórios.
# ls -li teste
# ln teste link-hard
Verifique que tanto o arquivo "teste" quanto o arquivo "link-hard" possuem o mesmo "inode":
Se você alterar a permissão de um dos dois arquivos, muda a permissão dos dois. Link Hard nada mais é do
que você criar um atalho para o mesmo arquivo físico (mesmo local na partição).
Você pode apagar um dos dois e o outro continua. "Você apaga apenas uma das referências".
Link simbólico
Link simbólico é um arquivo que aponta para outro arquivo.
# ln -s arquivo link-simbolico
# ls -ld link-simbolico
# ln -s /var variaveis
Diretórios que obrigatóriamente iniciam em / (raíz). Estes diretórios não podem ser montados fora da
partição / (root).
Os diretórios abaixo, podem ser montados, ou seja, não precisam estar na mesma partição:
No exemplo acima ele busca tudo o que encontrar com o nome juliano. Digamos que você tenha arquivos
(juliano2,juliano10), você pode fazer uma busca recursiva:
Para procurar arquivos de um determinado usuário, ou seja, que ele é o dono do arquivo, usamos:
Neste exemplo, o find vai prourar todos os arquivos do usuário aluno no diretório /home. Podemos usar
pelo tamanho, exemplo:
Comando locate
Neste exemplo ele vai buscar tudo que tenha "juliano" em sua base de dados. Como ele busca na base de
dados e não faz varredura do disco, ele é bem mais rápido. Mas é necessário, atualizar a base de dados.
# updatedb
Comando whereis
# whereis rpm
Comando which
O which procura somente nos diretórios PATH, e mostra somente o primeiro retorno que ele encontrar.
# which rpm
Comando type
# type ls
# type cd
Agradecimento
Agradeço a Deus sempre, por indiferente de meus erros humanos, tem sempre me abençoado e me
mostrado o caminho do bem e do amor. Agradeço a minha filha, que me inspira todos os dias e sabe
respeitar o meu trabalho. Algumas vezes quando venho a procrastinar o trabalho é ela quem me disciplina,
minha pequena princesa de nove anos.
Agradeço aos meus alunos, que confiam no meu trabalho. Sempre aprendo nas aulas, por que sou humilde
e mente aberta: "Ninguém é tão grande que não possa aprender, nem tão pequeno que não possa
ensinar."
Para finalizar, agradeço a mim mesmo! Por que aprendi a me amar, respeitar meus limites e acima de tudo,
aprendi a me perdoar. Confie em Deus e em ti mesmo, que a vida será doce.