(em desenvolvimento)
Yet Another Linux Howto (reconstruído)
Foco: Ubuntu (Debian-family) e Red Hat (RHEL-family)
Dedicado a Evi Nemeth e a Jokka das Trevas
Prólogo
Isto é um curso prático (com teoria na medida certa), pensado para te dar “mão de obra de produção” em ambientes corporativos: servidores, VMs, cloud, containers, automação e troubleshooting.
A regra do jogo: tudo com exemplos reais, e sempre com notas de diferença Ubuntu vs RHEL.
Como montar o laboratório (recomendado)
- 2 VMs:
- Ubuntu Server LTS
- RHEL / Rocky / Alma (equivalentes para treinar)
- Snapshot antes de cada módulo.
- Uma rede NAT + uma rede host-only (pra simular “corp” + “mgmt”).
- Uma pasta compartilhada com scripts e anotações.
Índice (limpo e sem duplicações)
- Fundamentos de Linux e linha de comando
- FHS, dispositivos e “tudo é arquivo”
- Pipes, redirecionamentos e processamento de texto (o “coração Unix”)
- Gerenciamento de pacotes e repositórios (APT vs DNF/RPM)
- Usuários, grupos, sudo e identidade corporativa (PAM/SSSD/LDAP)
- Permissões, ACL, umask, capabilities e (SELinux/AppArmor)
- Processos, sinais, prioridades e cgroups (prática de produção)
- Boot e systemd: units, targets, timers e troubleshooting de boot
- Logs, journald, logrotate e auditoria (auditd)
- Rede: IP, rotas, DNS, troubleshooting (Netplan vs NetworkManager)
- Firewall e filtragem: UFW/Firewalld, nftables e casos reais
- SSH e acesso remoto seguro (chaves, bastion, hardening)
- Storage: partições, RAID, LVM, filesystems (ext4/xfs/btrfs)
- Backups e recuperação (rsync/tar/borg/snapshots)
- Virtualização com KVM/libvirt (o padrão Linux)
- Containers: Podman/Docker, rootless, volumes, redes
- Automação: Bash “de verdade”, Python utilitário, Ansible
- Observabilidade: métricas, iostat/sar, Prometheus node_exporter (visão admin)
- Troubleshooting: método, ferramentas e “playbooks”
- Segurança operacional: patching, hardening, compliance e resposta a incidentes
- “Unix Pipe at the Gates of Dawn”: filosofia aplicada e fluência
1) Fundamentos de Linux e linha de comando
O que você precisa dominar
- Shell (bash), quoting, globbing, exit codes
- Navegação e manipulação segura de arquivos
- Ajuda:
man,--help,/usr/share/doc
Exemplos práticos
Quoting (isso separa admin bom de admin perigoso):
# errado (quebra em espaços)
rm -rf $DIR# certo
rm -rf -- "$DIR"
Erros e códigos de saída:
grep -q "PermitRootLogin no" /etc/ssh/sshd_config
echo $? # 0 achou, 1 não achou, >1 erro
Lab
- Criar estrutura de diretórios de um “app” e manipular com segurança:
mkdir -p ~/lab/app/{bin,conf,logs,data}
touch ~/lab/app/conf/app.confUbuntu vs RHEL: quase tudo igual aqui. Diferenças começam forte em rede, pacotes e segurança mandatory (SELinux/AppArmor).
2) FHS, dispositivos e “tudo é arquivo”
Conceitos-chave
/etc= configuração,/var= dados variáveis/logs,/usr= sistema/soft,/home- Dispositivos em
/deve pseudo-filesystems:/proc,/sys - Links: hardlink vs symlink (impacto em backup e deploy)
Exemplos
ls -l /dev/null
cat /proc/cpuinfo | head
ls -l /sys/class/net
Lab
- Descobrir “o que é real” vs “o que é virtual”:
df -Th
mount | column -t
3) Pipes e processamento de texto (fluência Unix)
O que importa de verdade
- Pipe
|conecta stdout → stdin - Redirecionamentos:
>,>>,2>,&>,<<EOF - Grep/sed/awk: quando usar cada um
- Regex ≠ wildcard
Exemplos (produção)
Achar top 10 IPs em access log:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | headVer erros de um serviço em tempo real:
journalctl -u ssh -f
Lab
- Criar um “relatório” de login falho (Ubuntu costuma em
/var/log/auth.log; RHEL via journald):
sudo grep -i "failed password" /var/log/auth.log | tail -n 50
4) Pacotes e repositórios (APT vs DNF/RPM)
Ubuntu (APT)
- Atualizar índice e atualizar sistema:
sudo apt update
sudo apt upgrade
- Buscar e inspecionar:
apt search nginx
apt show nginx
dpkg -L nginx
- Repositórios:
/etc/apt/sources.liste/etc/apt/sources.list.d/*.list- Chaves modernas:
/etc/apt/keyrings/*.gpg(evitarapt-key)
RHEL-family (DNF/RPM)
- Atualizar e instalar:
sudo dnf makecache
sudo dnf upgrade
sudo dnf install nginx
- Investigar:
dnf info nginx
rpm -ql nginx
- Repos:
/etc/yum.repos.d/*.repo
Conflitos e dependências (o que resolve 80% da dor)
- Ubuntu:
sudo apt -f install
sudo dpkg --configure -a
- RHEL:
sudo dnf repoquery --requires pacote
sudo dnf clean all
Lab
- Instalar
nginx, subir, validar e remover mantendo config vs removendo tudo.
5) Usuários, grupos, sudo e identidade corporativa
Fundamentos
- Bases locais:
/etc/passwd,/etc/shadow,/etc/group - Comandos essenciais:
useradd,usermod,groupadd,gpasswd - Sudo: regra é mínimo privilégio e auditoria
Exemplos
sudo useradd -m -s /bin/bash alice
sudo passwd alice
sudo usermod -aG sudo alice # Ubuntu (grupo sudo)
sudo usermod -aG wheel alice # RHEL (grupo wheel)
Sudo seguro (via visudo):
sudo visudo
# Exemplo: permitir apenas systemctl restart nginx
alice ALL=(root) NOPASSWD: /bin/systemctl restart nginx
Identidade corporativa (visão prática)
- PAM é o “pluggable glue”.
- Em empresas, o comum é SSSD + LDAP/Kerberos/AD.
- Arquivos/conceitos:
/etc/pam.d/*/etc/sssd/sssd.conf(quando usando SSSD)
Lab
- Criar usuário “deploy”, permitir só
systemctl restart app.service, e registrar acesso no log.
6) Permissões, ACL, umask, capabilities, SELinux/AppArmor
Permissões clássicas
- Dono/grupo/outros: r,w,x
chmod,chown,chgrpumaskdefine padrão de criação
umask 027
touch a
mkdir d
ls -l a d
ACL (quando permissão clássica não basta)
sudo setfacl -m u:alice:rwx /srv/app
getfacl /srv/app
Linux capabilities (cirúrgico)
Ex.: permitir bind em porta <1024 sem root:
sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/meuapp
getcap /usr/local/bin/meuapp
Mandatory Access Control
- Ubuntu: AppArmor (comum por padrão)
- RHEL: SELinux (forte e presente em corp)
SELinux (RHEL):
getenforce
sudo ausearch -m avc -ts recent | tail
sudo semanage fcontext -a -t httpd_sys_content_t "/srv/site(/.*)?"
sudo restorecon -Rv /srv/site
AppArmor (Ubuntu):
sudo aa-status
sudo aa-logprof
Lab
- Subir um conteúdo web em diretório “não padrão” e corrigir:
- No RHEL: context SELinux
- No Ubuntu: perfil AppArmor (se afetar)
7) Processos, sinais, prioridades e cgroups
Comandos essenciais
ps auxf
top
htop # se instalar
pidof nginx
Sinais (vida real)
TERM(15) pede para encerrar com limpezaKILL(9) é “mata e pronto” (último recurso)
sudo kill -TERM <pid>
sudo kill -KILL <pid>
Prioridade
nice -n 10 comando_pesado
sudo renice -n 5 -p <pid>
Cgroups/systemd (controle moderno)
systemctl status nginx
systemctl show -p ControlGroup nginx
8) Boot e systemd (units, targets, timers)
O que você precisa saber
systemctlé o painel central- Units:
service,socket,timer,mount,path - Targets ≈ “runlevels modernos”
Exemplos
systemctl status ssh
systemctl enable --now nginx
systemctl list-units --type=service --state=running
systemctl list-dependencies multi-user.target
Timers (substituto “enterprise” de cron em muitas coisas)
Exemplo: rodar script a cada 5 minutos:
/etc/systemd/system/meujob.service/etc/systemd/system/meujob.timer
# meujob.service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/meujob.sh
# meujob.timer
[Timer]
OnBootSec=2min
OnUnitActiveSec=5min
Unit=meujob.service[Install]
WantedBy=timers.target
sudo systemctl enable --now meujob.timer
systemctl list-timers --all
9) Logs, journald, logrotate e auditoria
Journald (padrão moderno em ambos)
journalctl -xe
journalctl -u nginx --since "1 hour ago"
journalctl -b -1 # boot anterior
Logs “clássicos”
- Ubuntu:
/var/log/auth.log,/var/log/syslog(a depender da config) - RHEL: pode ter rsyslog configurado; journald é central
logrotate
/etc/logrotate.confe/etc/logrotate.d/*
sudo logrotate -d /etc/logrotate.conf
auditd (compliance)
sudo systemctl enable --now auditd
sudo auditctl -l
10) Rede: IP, rotas, DNS (Netplan vs NetworkManager)
Ferramentas universais (iproute2)
ip a
ip r
ss -tulpn
ping -c 3 1.1.1.1
traceroute example.com
dig example.com
Ubuntu: Netplan (com backend systemd-networkd ou NetworkManager)
- Config:
/etc/netplan/*.yaml
sudo netplan try
sudo netplan apply
RHEL: NetworkManager (nmcli)
- Conexões em:
/etc/NetworkManager/system-connections/
nmcli dev status
nmcli con show
nmcli con mod "System eth0" ipv4.addresses 192.168.1.10/24 ipv4.gateway 192.168.1.1 ipv4.method manual
nmcli con up "System eth0"
DNS
- Hoje, normalmente via
systemd-resolved(Ubuntu) ou NM (RHEL). - Diagnóstico:
resolvectl status # Ubuntu comum
cat /etc/resolv.conf
11) Firewall: UFW, Firewalld e nftables
Ubuntu: UFW (interface amigável)
sudo ufw status
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw enable
RHEL: firewalld
sudo firewall-cmd --state
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
Lab
- Subir nginx e abrir porta 80 com a ferramenta “nativa” de cada distro.
12) SSH seguro (essencial corporativo)
Chaves e hardening básico
ssh-keygen -t ed25519
ssh-copy-id user@server
No servidor (/etc/ssh/sshd_config):
PasswordAuthentication noPermitRootLogin noAllowUsers alice deploy
sudo systemctl reload ssh
13) Storage: partições, LVM, RAID
Checklist prático
lsblk -f
blkid
df -Th
mount | column -t
Particionamento
fdisk,parted
LVM (produção real)
sudo pvcreate /dev/sdb
sudo vgcreate vgdata /dev/sdb
sudo lvcreate -n lvapp -L 50G vgdata
sudo mkfs.xfs /dev/vgdata/lvapp # xfs muito comum em RHEL
sudo mount /dev/vgdata/lvapp /srv/app
fstab (com UUID)
sudo blkid
sudoedit /etc/fstab
14) Backup e recuperação (sem romantismo)
Tríade do mundo real
- tar (empacotar)
- rsync (sincronizar incremental)
- borg/restic (backup com dedupe + criptografia)
rsync bom:
rsync -aHAX --delete /srv/app/ /backup/app/
tar com preservação:
tar --xattrs --acls -cpf backup.tar /srv/app
Teste de restore (sempre!)
- Restore parcial em diretório temporário
- Comparar checksums
15) Virtualização (KVM/libvirt)
Instalação típica
- Ubuntu:
qemu-kvm libvirt-daemon-system virt-manager - RHEL:
@virtualizationgroup
Comandos:
virsh list --all
virt-install --name vm1 --memory 2048 --vcpus 2 --disk size=20 --cdrom ubuntu.iso
16) Containers (Podman/Docker)
Diretriz atual (muito corp)
- RHEL: Podman é padrão/primeira classe
- Ubuntu: Docker ainda comum, Podman crescendo
Exemplos (podman):
podman run --rm -p 8080:80 docker.io/library/nginx
podman ps
podman logs <id>
Volumes e persistência:
podman run -v /srv/site:/usr/share/nginx/html:ro -p 8080:80 nginx
17) Automação: Bash, Python, Ansible
Bash “de produção” (mínimo)
set -euo pipefail- funções
- logs e exit codes
- parsing robusto
Exemplo esqueleto:
#!/usr/bin/env bash
set -euo pipefaillog(){ printf '%s %s\n' "$(date -Is)" "$*" >&2; }main(){
log "iniciando"
# ...
log "ok"
}
main "$@"
Ansible (corporativo de verdade)
- Inventário limpo
- idempotência
- roles
- vault para segredo
18) Observabilidade (admin)
Ferramentas nativas:
uptime
free -h
vmstat 1
iostat -xz 1
sar -n DEV 1
ss -s
Visão moderna:
- Prometheus + node_exporter + Grafana (mesmo que “não seja seu time”, você precisa ler o painel)
19) Troubleshooting (método)
O método que não falha
- Defina o sintoma (o que está quebrado e desde quando)
- Colete evidências (logs, métricas, configs, mudanças recentes)
- Isole (rede? disco? permissão? DNS? SELinux/AppArmor?)
- Corrija com rollback em mente
- Valide (teste + monitoramento)
- Documente
Kit rápido
- Boot:
journalctl -b,systemctl --failed - Rede:
ip r,dig,ss -tulpn - Storage:
df -Th,lsblk,dmesg -T | tail - Segurança:
ausearch -m avc(SELinux),aa-status(AppArmor)
20) Segurança operacional (prática corporativa)
- Patching com janela e rollback
- Endurecer SSH
- Firewall mínimo necessário
- Auditoria (auditd) quando exigido
- SELinux/AppArmor: aprender a corrigir, não “desligar”
21) Unix Pipe at the Gates of Dawn (síntese)
Pipe é filosofia operacional:
- Ferramentas pequenas, composição grande
- Texto como interface
- Observabilidade via logs e streams
Exemplo “(uma linha que salva incidentes):
journalctl -u nginx --since today | grep -Ei "error|fail|timeout" | tail -n 50
Mini-projetos (pra consolidar)
- Servidor web hardenizado (nginx + firewall + logs + backup + user deploy)
- Job automatizado (systemd timer que gera relatório e envia pra um diretório seguro)
- Ambiente container (app + volume persistente + restart policy via systemd)
- Troubleshooting simulado (DNS quebrado, rota errada, SELinux bloqueando, disco cheio)