GNU/Linux

Conceitos de Sistemas Operacionais no Linux, terminologia básica, gerenciamento de serviços (systemd), pacotes e containers Docker em linha de comando, logs e edição de arquivos.

Por Fábio Linhares • Instituto Infnet

EXERCÍCIO 01
Terminologia Básica do Linux
Diferenciar aplicação, programa, binário e executável.
Aplicação: É um software completo que realiza uma tarefa para o usuário. Ex: Navegador Firefox, Suite de escritório LibreOffice. É um conceito de alto nível.
Programa: Um conjunto de instruções. Pode ser uma aplicação inteira ou um pequeno comando como `ls`. Os termos são frequentemente usados de forma intercambiável.
Binário: É um arquivo que contém código de máquina (0s e 1s) que o processador entende diretamente. Não é legível por humanos.
Executável: É qualquer arquivo que o sistema operacional pode rodar. No Linux, isso é definido pela permissão de execução (`x`). Um binário é quase sempre um executável, mas um script de texto (como um arquivo `.sh`) também pode ser um executável.
hacker@matrix:~$ls -l /bin/ls
-rwxr-xr-x 1 root root 146080 Jul 18 2023 /bin/ls

A presença do 'x' nas permissões (`-rwxr-xr-x`) confirma que `/bin/ls` é um executável.

hacker@matrix:~$file /bin/ls
/bin/ls: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=..., stripped

A saída "ELF 64-bit ... executable" mostra que ele é um arquivo binário, compilado para a arquitetura x86-64.

EXERCÍCIO 02
Binários no Sistema
Listar três binários e classificá-los como programas ou executáveis.
Todos os arquivos listados abaixo são, ao mesmo tempo, programas (porque executam uma tarefa específica) e executáveis (porque o sistema pode rodá-los). O comando `file` comprova sua natureza binária e executável.
hacker@matrix:~$file /bin/grep
/bin/grep: ELF 64-bit LSB pie executable, x86-64...
hacker@matrix:~$file /bin/cat
/bin/cat: ELF 64-bit LSB pie executable, x86-64...
hacker@matrix:~$file /bin/ping
/bin/ping: ELF 64-bit LSB pie executable, x86-64...
EXERCÍCIO 03
Processo de Inicialização do Linux
Detalhar as etapas do bootloader até o systemd.
O processo de inicialização do Linux transforma uma máquina desligada em um sistema operacional funcional. As etapas principais são:

1. BIOS/UEFI: O firmware da placa-mãe acorda, realiza um autoteste de hardware (POST) e procura por um dispositivo de boot.

2. Bootloader (GRUB2): O BIOS/UEFI encontra e carrega o bootloader (geralmente o GRUB2) a partir do disco. O GRUB2 exibe um menu de sistemas operacionais e, em seguida, carrega o Kernel Linux e o `initramfs` (um sistema de arquivos inicial temporário) na memória RAM.

3. Kernel: Uma vez na memória, o Kernel assume o controle. Ele inicializa o hardware principal (processador, memória) e usa os drivers do `initramfs` para montar o sistema de arquivos raiz (`/`) do disco.

4. Processo `init` (systemd): O Kernel executa o primeiro processo do sistema, que tem o PID (Process ID) 1. Em sistemas modernos, este processo é o systemd. O `systemd` lê seus arquivos de configuração e começa a iniciar todos os outros serviços e processos necessários (rede, interface gráfica, etc.) de forma paralela e eficiente para finalizar o boot.
EXERCÍCIO 04
Mensagens do Kernel na Inicialização
Utilizar dmesg para identificar a detecção de um dispositivo.
O comando `dmesg` exibe as mensagens do "ring buffer" do kernel. É uma ferramenta poderosa para diagnosticar problemas de hardware, pois mostra exatamente como o kernel detectou e inicializou os dispositivos do sistema desde o boot.
# Filtrando dmesg para encontrar mensagens sobre um disco USB (geralmente 'sdb' ou 'sdc'). dmesg | grep sdb
[ 250.123456] usb 1-2: new high-speed USB device number 3 using xhci_hcd [ 250.234567] usb-storage 1-2:1.0: USB Mass Storage device detected [ 250.234789] scsi host2: usb-storage 1-2:1.0 [ 251.345678] scsi 2:0:0:0: Direct-Access Kingston DataTraveler 3.0 PMAP PQ: 0 ANSI: 6 [ 251.345901] sd 2:0:0:0: [sdb] 15122432 512-byte logical blocks: (7.74 GB/7.21 GiB) [ 251.346123] sd 2:0:0:0: [sdb] Write Protect is off [ 251.346345] sd 2:0:0:0: [sdb] Mode Sense: 43 00 00 00 [ 251.346567] sd 2:0:0:0: [sdb] No Caching mode page found [ 251.346789] sd 2:0:0:0: [sdb] Assuming drive cache: write through [ 251.456789] sdb: sdb1 [ 251.458012] sd 2:0:0:0: [sdb] Attached SCSI removable disk
Análise da Saída: As linhas acima mostram o kernel detectando um dispositivo USB (`new high-speed USB device`), identificando-o como armazenamento em massa (`USB Mass Storage`), e finalmente atribuindo a ele o nome de dispositivo de bloco `[sdb]`, informando seu tamanho e partições (`sdb1`).
EXERCÍCIO 05
Serviços em Execução no Linux
Usar systemctl para mostrar serviços ativos e explicar a função de dois deles.
hacker@matrix:~$systemctl list-units --type=service --state=running
UNIT LOAD ACTIVE SUB DESCRIPTION accounts-daemon.service load active running Accounts Service ... cron.service load active running Regular background program processing daemon ... networkd-dispatcher.service load active running Dispatcher daemon for systemd-networkd sshd.service load active running OpenBSD Secure Shell server ... user@1000.service load active running User Manager for UID 1000 LOAD = Reflects whether the unit definition was properly loaded. ACTIVE = The high-level unit activation state, i.e. generalization of SUB. SUB = The low-level unit activation state, values depend on unit type. XX units listed.
Dois Serviços Importantes:

1. cron.service: Este é o daemon "Cron", um agendador de tarefas. Ele é responsável por executar scripts e comandos automaticamente em horários, datas ou intervalos pré-definidos. É fundamental para tarefas de manutenção, backups e automação do sistema.

2. sshd.service: Este é o daemon do "OpenSSH Server". Ele permite que você se conecte de forma segura ao seu sistema a partir de outra máquina na rede usando o protocolo SSH. É essencial para administração remota de servidores.
EXERCÍCIO 06
Gerência de Serviços com systemd
Parar, reiniciar e comprovar a execução de um serviço.
Vamos usar o serviço `cron` (agendador de tarefas) como exemplo para demonstrar o ciclo de gerenciamento.
hacker@matrix:~$sudo systemctl status cron.service
● cron.service - Regular background program processing daemon Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2025-09-19 14:00:00 -03; 3h 15min ago ...
hacker@matrix:~$sudo systemctl stop cron.service
hacker@matrix:~$sudo systemctl status cron.service
● cron.service - Regular background program processing daemon Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled) Active: inactive (dead) since Fri 2025-09-19 17:15:30 -03; 5s ago ...
hacker@matrix:~$sudo systemctl start cron.service
hacker@matrix:~$sudo systemctl status cron.service
● cron.service - Regular background program processing daemon Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2025-09-19 17:16:00 -03; 3s ago ...
EXERCÍCIO 07
Inicialização Automática de Serviços
Habilitar um serviço para iniciar junto com o sistema.
Quando um serviço está "enabled" (habilitado), o `systemd` garante que ele será iniciado automaticamente durante o boot do sistema. O comando `systemctl enable` cria links simbólicos nos diretórios de "targets" do systemd para garantir isso.
hacker@matrix:~$sudo systemctl is-enabled sshd.service
disabled
hacker@matrix:~$sudo systemctl enable sshd.service
Created symlink /etc/systemd/system/multi-user.target.wants/sshd.service → /lib/systemd/system/sshd.service.
hacker@matrix:~$sudo systemctl is-enabled sshd.service
enabled
hacker@matrix:~$sudo systemctl disable sshd.service
Removed /etc/systemd/system/multi-user.target.wants/sshd.service.
EXERCÍCIO 08
Sistemas de Init
Explicar as diferenças entre SysVinit e systemd.
SysVinit e systemd são sistemas de inicialização (`init`), os primeiros processos (PID 1) iniciados pelo kernel, responsáveis por iniciar todo o resto do sistema.

SysVinit (o antigo):
  • Sequencial: Inicia os serviços um após o outro, em uma ordem rígida definida pelos runlevels. Isso tornava o boot mais lento.
  • Baseado em Shell Scripts: A lógica de cada serviço (start, stop, restart) era definida em scripts complexos localizados em `/etc/init.d/`.
  • Runlevels: Usava o conceito de "níveis de execução" (ex: nível 3 para modo texto, nível 5 para modo gráfico).
systemd (o moderno):
  • Paralelizado: Inicia serviços em paralelo, aproveitando dependências e sockets, o que torna o boot drasticamente mais rápido.
  • Baseado em Unidades: Usa arquivos de configuração simples e declarativos (arquivos `.service`) para definir como um serviço deve se comportar.
  • Targets: Usa o conceito de "alvos" (ex: `multi-user.target`, `graphical.target`) que são mais flexíveis que runlevels.

Duas Vantagens do systemd:
1. Velocidade de Boot: A capacidade de paralelizar a inicialização de serviços é a vantagem mais notável, resultando em tempos de boot muito mais curtos.
2. Gerenciamento e Diagnóstico Centralizados: Com `systemctl`, você tem um único comando para controlar todos os aspectos de um serviço. Com `journalctl`, você tem um log centralizado, agregado e estruturado de todo o sistema, o que simplifica enormemente a depuração de problemas.
EXERCÍCIO 09
Logs de Serviços
Utilizar journalctl -u para verificar o histórico de um serviço.
O `journalctl` é a ferramenta do `systemd` para consultar os logs. A flag `-u` (unit) permite filtrar as mensagens por um serviço específico. Vamos inspecionar os logs do serviço SSH (`sshd.service`).
hacker@matrix:~$journalctl -u sshd.service
-- Logs begin at Fri 2025-09-19 14:00:00 -03, end at Fri 2025-09-19 17:30:00 -03. -- set 19 16:10:01 meu-servidor systemd[1]: Starting OpenBSD Secure Shell server... set 19 16:10:02 meu-servidor sshd[1234]: Server listening on 0.0.0.0 port 22. set 19 16:10:02 meu-servidor sshd[1234]: Server listening on :: port 22. set 19 16:10:02 meu-servidor systemd[1]: Started OpenBSD Secure Shell server. set 19 16:15:30 meu-servidor sshd[5678]: Accepted password for usuario from 192.168.1.100 port 54321 ssh2 set 19 16:15:30 meu-servidor sshd[5678]: pam_unix(sshd:session): session opened for user usuario by (uid=0) ... set 19 17:25:00 meu-servidor systemd[1]: Stopping OpenBSD Secure Shell server... set 19 17:25:00 meu-servidor systemd[1]: sshd.service: Succeeded. set 19 17:25:00 meu-servidor systemd[1]: Stopped OpenBSD Secure Shell server.
Eventos Relevantes:
  • `Starting OpenBSD Secure Shell server...`: O `systemd` inicia o serviço.
  • `Server listening on 0.0.0.0 port 22.`: O serviço confirma que está ativo e escutando na porta 22.
  • `Accepted password for usuario...`: Um evento de segurança importante, registrando um login bem-sucedido.
  • `Stopping OpenBSD Secure Shell server...`: O `systemd` para o serviço.
EXERCÍCIO 10
Pacotes no Ubuntu
Utilizar o apt para instalar e remover um pacote.
O `apt` (Advanced Package Tool) é o gerenciador de pacotes padrão em sistemas baseados em Debian, como o Ubuntu. Vamos instalar e remover o `htop`, um monitor de processos interativo.
hacker@matrix:~$sudo apt update
Hit:1 http://br.archive.ubuntu.com/ubuntu jammy InRelease...
Reading package lists... Done
hacker@matrix:~$sudo apt install htop
Reading package lists... Done Building dependency tree... Done The following NEW packages will be installed: htop 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. Need to get 100 kB of archives. After this operation, 250 kB of additional disk space will be used. Do you want to continue? [Y/n] Y ... Processing triggers for man-db (2.10.2-1) ...
hacker@matrix:~$htop
hacker@matrix:~$sudo apt remove htop
Reading package lists... Done Building dependency tree... Done The following packages will be REMOVED: htop 0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded. After this operation, 250 kB disk space will be freed. Do you want to continue? [Y/n] Y (Reading database ... 123456 files and directories currently installed.) Removing htop (3.2.1-1build1) ...
EXERCÍCIO 11
Cadeia de Suprimentos de Pacotes
Descrever a função dos repositórios e mantenedores.
A instalação de software no Ubuntu é segura e confiável devido a uma cadeia de suprimentos bem definida.

Repositórios: São servidores online que armazenam milhares de pacotes de software (`.deb`) testados e compilados especificamente para a sua versão do Ubuntu. Eles funcionam como um "depósito central" ou uma "loja de aplicativos" para o sistema. Quando você executa `sudo apt install`, o sistema se conecta a esses repositórios para baixar e instalar o software de forma segura.

Mantenedores: São as pessoas ou equipes responsáveis por cada pacote dentro do repositório. O trabalho deles é crucial: eles pegam o código-fonte original de um programa (ex: do Firefox), o compilam, empacotam no formato `.deb`, gerenciam as dependências, aplicam patches de segurança específicos para o Ubuntu e garantem que o pacote se integre bem ao resto do sistema. Eles são os guardiões da qualidade e segurança do software que você instala.
hacker@matrix:~$apt show nano
Package: nano Version: 6.2-1 Priority: standard Section: editors Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Jordi Mallach Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 840 kB Depends: libc6 (>= 2.34), libncursesw6 (>= 6), libtinfo6 (>= 6) ... Description: small, friendly text editor inspired by Pico Nano is a small and friendly text editor.

Na saída, vemos o campo `Maintainer: Ubuntu Developers`, que indica a equipe responsável por este pacote nos repositórios do Ubuntu.

EXERCÍCIO 12
Pacotes Instalados
Exibir os pacotes existentes e destacar 5 importantes.
hacker@matrix:~$apt list --installed
Listing... Done ... apt/jammy-updates,now 2.4.11 amd64 [installed] base-files/jammy-updates,now 12ubuntu4.4 amd64 [installed] bash/jammy,now 5.1-6ubuntu1 amd64 [installed] ... coreutils/jammy,now 8.32-4.1ubuntu1 amd64 [installed] ... libc6/jammy-updates,now 2.35-0ubuntu3.1 amd64 [installed] ... systemd/jammy-updates,now 249.11-0ubuntu3.9 amd64 [installed] ...
5 Pacotes Essenciais Destacados:
  1. libc6: A Biblioteca C da GNU. É a biblioteca mais fundamental do sistema. Praticamente todos os programas em um sistema Linux dependem dela para funcionar.
  2. coreutils: "Core Utilities" ou Utilitários Principais. Este pacote contém os comandos básicos e essenciais que usamos todos os dias, como `ls`, `cat`, `rm`, `cp`, `mv`, etc.
  3. bash: O shell padrão da maioria das distribuições Linux. É o interpretador de comandos que nos permite interagir com o sistema.
  4. apt: O gerenciador de pacotes padrão em distribuições baseadas em Debian. Essencial para instalar, atualizar e remover software.
  5. systemd: O sistema de inicialização e gerenciador de serviços. Fundamental para o boot e gerenciamento de processos no Linux moderno.
EXERCÍCIO 13
Instalação do Docker
Instalar e verificar o Docker no Ubuntu.
O Docker é uma plataforma que permite criar, implantar e executar aplicativos em contêineres. Contêineres são pacotes leves e portáteis que incluem tudo o que um aplicativo precisa para ser executado, garantindo que ele funcione de maneira consistente em qualquer ambiente.
# 1. Atualizar a lista de pacotes. sudo apt update # 2. Instalar pacotes necessários para permitir o uso de repositórios sobre HTTPS. sudo apt install apt-transport-https ca-certificates curl software-properties-common # 3. Adicionar a chave GPG oficial do Docker. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - # 4. Adicionar o repositório do Docker às fontes do APT. sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" # 5. Atualizar a lista de pacotes novamente. sudo apt update # 6. Instalar o Docker. sudo apt install docker-ce # 7. Verificar se o Docker está ativo e rodando. sudo systemctl status docker
Após a instalação, é recomendável adicionar seu usuário ao grupo `docker` para executar comandos do Docker sem `sudo`. Para isso, use o comando:
sudo usermod -aG docker $USER
Depois, faça logout e login novamente para que as mudanças tenham efeito.
EXERCÍCIO 14
Comandos Básicos do Docker
Familiarizar-se com comandos essenciais do Docker.
Aqui estão alguns comandos básicos do Docker que todo usuário deve conhecer:
  • docker --version: Verifica a versão do Docker instalada.
  • docker pull <imagem>: Baixa uma imagem do Docker Hub.
  • docker images: Lista todas as imagens baixadas no sistema.
  • docker rmi <imagem>: Remove uma imagem do sistema.
  • docker run <imagem>: Executa um contêiner a partir de uma imagem.
  • docker ps: Lista os contêineres em execução.
  • docker stop <contêiner>: Para um contêiner em execução.
  • docker rm <contêiner>: Remove um contêiner parado.
hacker@matrix:~$docker --version
Docker version 20.10.7, build f0df350
hacker@matrix:~$docker pull ubuntu
Using default tag: latest latest: Pulling from library/ubuntu Digest: sha256:... Status: Downloaded newer image for ubuntu:latest docker.io/library/ubuntu:latest
hacker@matrix:~$docker images
REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu latest 2e1d9d6e4f3d 2 weeks ago 64.2MB
hacker@matrix:~$docker run -it ubuntu
root@contêiner-id:/#
EXERCÍCIO 15
Docker Compose
Instalar e entender o básico sobre Docker Compose.
O Docker Compose é uma ferramenta que permite definir e executar aplicativos Docker multi-contêiner. Com o Compose, você usa um arquivo YAML para configurar os serviços do seu aplicativo e, em seguida, com um único comando, você cria e inicia todos os serviços a partir da configuração.
hacker@matrix:~$sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
hacker@matrix:~$sudo chmod +x /usr/local/bin/docker-compose
hacker@matrix:~$docker-compose --version
Após a instalação, é recomendável ler a documentação oficial do Docker Compose para entender como criar e gerenciar aplicativos multi-contêiner: Documentação do Docker Compose
EXERCÍCIO 16
Kubernetes
Introduzir os conceitos básicos do Kubernetes.
O Kubernetes, também conhecido como K8s, é um sistema de orquestração de contêineres open-source. Ele automatiza a implantação, o dimensionamento e o gerenciamento de aplicativos em contêineres.

Conceitos Básicos:
  • Pod: A menor unidade do Kubernetes, um Pod é um grupo de um ou mais contêineres, com armazenamento compartilhado e rede, que são gerenciados como uma única entidade.
  • Service: Uma abstração que define um conjunto lógico de Pods e uma política pela qual acessá-los.
  • Deployment: Uma declaração sobre o estado desejado para os Pods, como quais imagens de contêiner usar e quantas réplicas manter.
Comandos Úteis:
  • kubectl get pods: Lista todos os Pods em execução no cluster.
  • kubectl describe pod <nome-do-pod>: Mostra detalhes sobre um Pod específico.
  • kubectl delete pod <nome-do-pod>: Remove um Pod do cluster.