IFCE Horizonte · Portal
ADS23 · Sistemas Operacionais

Mão na massa · ~45 min

Mapeando o disco — e provando o que sobrevive a um container

Hoje você mapeia os discos da máquina, aprende a dupla de comandos que resolve o incidente "o disco encheu", confirma que dispositivos são arquivos como quaisquer outros, e termina provando na prática a diferença entre um container com e sem volume.

Passos 1–5 · Discos, espaço e latênciaPassos 6–8 · Reforço Docker: volumes

Passo 1 de 8

Mapeando os discos da máquina

Antes de diagnosticar qualquer coisa de E/S, é preciso saber o que existe: quais discos, quais partições, montadas onde.
1lsblk

O que é

Lista os dispositivos de bloco (discos e partições) em formato de árvore, mostrando tamanho e ponto de montagem.

Por que importa

É o primeiro comando de qualquer investigação de armazenamento — mostra a estrutura física antes de olhar o uso.

$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
loop0    7:0    0    74M  1 loop /snap/core22/1564
loop1    7:1    0   505M  1 loop /snap/gnome-42-2204/176
sda      8:0    0    25G  0 disk
├─sda1   8:1    0     1M  0 part
└─sda2   8:2    0    25G  0 part /
sr0     11:0    1  1024M  0 rom
O que esperar:

o disco da sua VM (provavelmente sda, ~25G conforme configurado na Semana 0), com uma partição grande montada em /. As linhas loop no topo são os pacotes snap, cada um um arquivo montado como se fosse um disco — mais um exemplo de "tudo é arquivo". E o swap dos Encontros 9 e 10 não aparece: no Ubuntu 24.04 ele é um arquivo (/swap.img) dentro da partição /, não uma partição própria.

Passo 2 de 8

Quanto espaço resta

Agora a pergunta mais frequente de sustentação: quanto ainda cabe?
2df -h

O que é

"Disk free" — espaço usado e disponível por sistema de arquivos montado. O -h converte pra G/M legíveis.

Por que importa

Responde qual partição está cheia. É sempre o primeiro passo do incidente "a aplicação parou de gravar".

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        25G  8.1G   16G  35% /
tmpfs           1.9G     0  1.9G   0% /dev/shm
O que esperar:

a coluna Use% da partição /. Anote esse percentual — quando passa de ~90% em produção, é hora de agir.

O que é esse tmpfs que aparece na lista?

É um sistema de arquivos que vive na memória RAM, não em disco — some quando a máquina desliga. É outro exemplo da abstração do slide 6: algo que não é disco algum, mas aparece como um caminho normal na árvore de arquivos.

Passo 3 de 8

Quem está ocupando o espaço

O df disse qual partição está cheia. O du diz o que, dentro dela, está ocupando lugar.
3sudo du -sh /var/* 2>/dev/null | sort -h | tail -5

O que é

"Disk usage" — soma o tamanho de cada subdiretório de /var. O sort -h ordena por tamanho e o tail -5 mostra os cinco maiores.

Por que importa

/var é onde ficam logs e dados variáveis — o suspeito número um quando um disco enche sozinho.

$ sudo du -sh /var/* 2>/dev/null | sort -h | tail -5
28M     /var/backups
94M     /var/cache
312M    /var/log
1.4G    /var/lib
O que esperar:

/var/lib e /var/log entre os maiores. Note o encadeamento de pipes — é exatamente a técnica do Encontro 6, agora aplicada a um problema real de diagnóstico.

O comando está demorando muito

O du percorre todos os arquivos, então demora proporcionalmente ao volume de dados. Nunca rode du direto na raiz / sem necessidade — comece por diretórios específicos, como fizemos com /var. O 2>/dev/null descarta erros de permissão (redirecionamento de stderr, do Encontro 6).

qual a diferença entre o que o df e o du respondem? Em que ordem você usaria os dois num incidente de "disco cheio"?

0 / 40 caracteres

Passo 4 de 8

Dispositivos são arquivos mesmo?

Vamos confirmar na prática a afirmação do slide 6 — inclusive nos dois dispositivos que vocês já usaram sem saber.
4ls -l /dev/null /dev/zero /dev/sda

O que é

Lista três dispositivos como se fossem arquivos comuns. A primeira letra da permissão indica o tipo: c = caractere, b = bloco.

Por que importa

Confirma a nomeação uniforme do slide 5 — a razão de cat, dd e redirecionamento funcionarem igual com arquivo ou dispositivo.

$ ls -l /dev/null /dev/zero /dev/sda
crw-rw-rw- 1 root root 1, 3 /dev/null
crw-rw-rw- 1 root root 1, 5 /dev/zero
brw-rw---- 1 root disk 8, 0 /dev/sda
O que esperar:

c no início das linhas de null e zero, b na do disco. Repare também que, no lugar do tamanho, aparecem dois números (major, minor) — o endereço do driver no kernel.

Passo 5 de 8

O disco está sendo o gargalo?

A ferramenta que responde diretamente se a lentidão vem do disco.
5iostat -x 1 3

O que é

Estatísticas estendidas de E/S, 3 amostras de 1 segundo. As colunas-chave são %util (o quanto do tempo o disco teve trabalho em andamento) e r_await/w_await (tempo médio de cada leitura/escrita, em ms, contando a espera na fila). A primeira amostra é a média desde que a VM ligou; olhe as seguintes.

Por que importa

%util perto de 100% significa disco saturado — o gargalo é ele, não a CPU.

$ iostat -x 1 3
Device     r/s   rkB/s  r_await    w/s   wkB/s  w_await  aqu-sz  %util
sda       0.42   18.60     0.61   3.18  126.40     4.83    0.02   1.20
O que esperar:

%util baixo numa VM ociosa (a saída real tem mais colunas; procure estas). Para ver o número subir, abra outro terminal e rode dd if=/dev/zero of=teste bs=1M count=500 oflag=direct enquanto o iostat roda — e depois apague o arquivo com rm teste.

iostat: comando não encontrado

O iostat vem no pacote sysstat, que não é instalado por padrão no Ubuntu. Instale com sudo apt install sysstat. Se não conseguir instalar agora, pule este passo — os demais não dependem dele.

Reforço Docker · o dado que sobrevive

Passo 6 de 8

Sem volume: o dado morre com o container

Primeiro o cenário ingênuo — gravar um arquivo dentro do container, destruí-lo, e ver o que acontece.
6Gravar → destruir → conferir

O que é

Cria um arquivo na camada de escrita do próprio container, remove o container, e sobe outro para verificar se o arquivo continua lá.

Por que importa

Demonstra, sem margem pra dúvida, o que "container é efêmero" significa na prática.

$ docker run --name semvol alpine sh -c "echo 'dado importante' > /dados.txt && cat /dados.txt"
dado importante
$ docker rm semvol
semvol
$ docker run --rm alpine cat /dados.txt
cat: can't open '/dados.txt': No such file or directory
O que esperar:

o arquivo existe enquanto o container vive, e desaparece quando ele é removido. Pare um instante nessa linha de erro e pense: e se isso fosse o banco de dados de um sistema em produção?

Passo 7 de 8

Com volume: o dado sobrevive

Agora exatamente a mesma sequência, mudando uma única coisa: um volume montado.
7-v meuvolume:/dados

O que é

-v meuvolume:/dados monta um volume gerenciado pelo Docker (gravado no disco do host) dentro do container, no caminho /dados.

Por que importa

É assim que se roda banco de dados, uploads de usuário, ou qualquer dado que não pode se perder quando o container reinicia.

$ docker run --name comvol -v meuvolume:/dados alpine sh -c "echo 'dado importante' > /dados/arquivo.txt"
$ docker rm comvol
comvol
$ docker run --rm -v meuvolume:/dados alpine cat /dados/arquivo.txt
dado importante
O que esperar:

desta vez o conteúdo aparece, mesmo com o container original já destruído. O dado está no host, não no container. Confirme com docker volume ls que o volume continua existindo por conta própria.

Onde esse volume fica fisicamente no host?

Rode docker volume inspect meuvolume — o campo Mountpoint mostra o caminho real no disco da VM. É um diretório comum, dentro da área do Docker, exatamente no sistema de arquivos que você mapeou no passo 1.

o que aconteceu com o arquivo no passo 6 e no passo 7? Por que a diferença, se o comando era praticamente o mesmo?

0 / 40 caracteres

Passo 8 de 8

Limpando

Remova o volume criado — e note que ele precisa ser removido explicitamente, justamente porque sobrevive aos containers.
8docker volume rm meuvolume

O que é

Remove o volume e os dados dentro dele. Confira antes com docker volume ls e docker ps -a se sobrou algo dos testes.

Por que importa

Volumes órfãos acumulam silenciosamente e são causa comum de disco cheio em máquinas de desenvolvimento — exatamente o incidente do passo 2.

O que esperar:

o nome do volume impresso de volta. Se der erro de "volume in use", remova antes os containers que ainda o referenciam.

livre: algo que te surpreendeu ou uma dúvida que sobrou de hoje

0 / 40 caracteres

Exemplo de observação forte × fraca

Observação fraca

"Com volume o arquivo ficou salvo e sem volume ele sumiu."

Observação forte

"No passo 6 o arquivo foi gravado na camada de escrita do próprio container — quando rodei docker rm, essa camada foi destruída junto e o dado se perdeu. No passo 7, o -v montou um diretório do host dentro do container, então a gravação aconteceu fora dele; por isso o dado sobreviveu à destruição. Na prática, isso significa que rodar um banco de dados em container sem volume é perder tudo no primeiro docker rm."

Checklist final

  • Mapeei discos e partições com lsblk
  • Verifiquei o espaço livre com df -h
  • Encontrei os maiores consumidores de espaço com du
  • Confirmei que dispositivos aparecem como arquivos em /dev
  • Li %util e await no iostat (ou registrei que o pacote não estava disponível)
  • Comprovei que o dado some num container sem volume
  • Comprovei que o dado sobrevive com volume montado
  • Limpei containers e volumes de teste
  • Preenchi as 3 observações acima (vou colar no quiz semanal)
0 / 9 verificados