Files
pf-linux-port/scripts/screencast/phases/06-qos.sh
T
lgcosta fe324259c0 Screencasts: seis videos silenciosos 1080p30 da demonstracao
Novo pipeline de video: scripts/screencast/render.py roda uma fase em um pty,
emula o terminal com pyte, gera frames PNG e mux com ffmpeg (H.264,
yuv420p, +faststart, sem trilha de audio). Fallback de encoder: libx264 ->
libopenh264 -> VP9.

Fases (scripts/screencast/phases/, uma sessao real contra o lab por video):
  1. implementacao no kernel - fontes OpenBSD + compat + build limpo do pf.ko
  2. ativacao - insmod, /dev/pf, pfctl -e, pfctl -s info
  3. regras basicas - tabela, anchor, keep state, block drop
  4. roteamento - route-to e reply-to (provado com tcpdump nas 2 interfaces)
  5. balanceamento - pool round-robin, pool source-hash, dup-to
  6. QOS - filas hfsc, pfctl -s queue -v, transferencia de 2 MB pela fila

Os videos ficam versionados em out/screencast/ (.gitignore ajustado para
nao ignorar *.mp4) e o indice/texto de descricao do YouTube em
docs/{en,pt-BR}/screencast.md.

Correcoes na propria demo (encontradas gravando): a acao de uma regra no pf
e pass OU block (nunca os dois); as regras de um anchor vivem em um ruleset
proprio (pfctl -a <anchor> -f); o nc do QOS precisa rodar na VM do servidor,
nao no firewall; o rotulo 'FASE x/6' vem do numero da fase, nao da posicao
na lista de gravacao.
2026-11-12 08:41:41 -03:00

46 lines
1.6 KiB
Bash
Executable File

#!/usr/bin/env bash
# Fase 6 - QOS: filas do OpenBSD 8.0 (hfsc) no caminho de dados do Linux.
set -u
cd "$(dirname "$0")"
. ./lib.sh
banner "FASE 6 - QOS (FILAS / ALTQ)"
p0 "/opt/pf/pfctl -e"
p0 "/opt/pf/pfctl -f /dev/null"
IF_SRV=$(onvm "$PF0_MGMT" "ip route get $SRV_IP | grep -o 'dev [a-z0-9]*' | cut -d' ' -f2" | tr -d '\r')
[ -n "$IF_SRV" ] || IF_SRV=eth2
bold "# a sintaxe de filas do OpenBSD 8.0: queue com classes hfsc"
cat > /tmp/sc-q.conf <<CONF
queue rootq on $IF_SRV bandwidth 10Mbit
queue leafq on $IF_SRV bandwidth 2Mbit parent rootq default
pass in quick proto tcp from $CLI_IP to $SRV_IP port 9095 queue leafq keep state
pass out quick keep state
CONF
put /tmp/sc-q.conf >/dev/null
p0 "cat /tmp/sc-q.conf"
p0 "/opt/pf/pfctl -f /tmp/sc-q.conf && echo 'filas carregadas'"
p0 "/opt/pf/pfctl -sr"
echo
bold "# o pfctl mostra as classes e as estatisticas do escalonador"
p0 "/opt/pf/pfctl -s queue -v"
echo
bold "# transferencia de 2 MB pela fila: o trafego entra na classe"
vms "head -c 2000000 /dev/zero | tr '\\0' A > /tmp/sc_data.bin; ls -l /tmp/sc_data.bin; pkill nc 2>/dev/null; (setsid nc -l -p 9095 < /tmp/sc_data.bin >/dev/null 2>&1 &); sleep 1; echo 'servidor escutando na 9095'"
vmc "nc -w60 $SRV_IP 9095 > /tmp/sc_out.bin; wc -c < /tmp/sc_out.bin"
sleep 1
p0 "/opt/pf/pfctl -s queue -v"
echo
bold "# a disciplina hfsc contou o trafego da classe"
p0 "/opt/pf/pfctl -sr -vv | head -6"
p0 "ip -s link show $IF_SRV | head -4"
echo
p0 "/opt/pf/pfctl -f /dev/null; pkill nc 2>/dev/null; /opt/pf/pfctl -s queue -v"
green " filas do OpenBSD 8.0 (hfsc) anexadas a interface e contando pacotes"