#!/bin/bash # ───────────────────────────────────────────────────────── # setup.sh — Instala todas as dependências necessárias # # Execute: sudo bash scripts/setup.sh # ───────────────────────────────────────────────────────── set -euo pipefail RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } log_ok() { echo -e "${GREEN}[OK]${NC} $1"; } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } log_error() { echo -e "${RED}[ERRO]${NC} $1"; } echo "" echo -e "${BLUE}═══════════════════════════════════════════════${NC}" echo -e "${BLUE} Instalação de dependências - eBPF Sockmap${NC}" echo -e "${BLUE}═══════════════════════════════════════════════${NC}" echo "" # Verifica se é root if [ "$(id -u)" -ne 0 ]; then log_error "Execute como root: sudo bash scripts/setup.sh" exit 1 fi # Detecta distribuição if [ -f /etc/os-release ]; then . /etc/os-release DISTRO=$ID else DISTRO="unknown" fi log_info "Distribuição detectada: $DISTRO" log_info "Kernel: $(uname -r)" echo "" # ─── Verifica versão do kernel ─── KERNEL_MAJOR=$(uname -r | cut -d. -f1) KERNEL_MINOR=$(uname -r | cut -d. -f2) if [ "$KERNEL_MAJOR" -lt 5 ] || ([ "$KERNEL_MAJOR" -eq 5 ] && [ "$KERNEL_MINOR" -lt 4 ]); then log_error "Kernel $(uname -r) muito antigo! eBPF sockmap requer kernel >= 5.4" log_error "Atualize o kernel antes de continuar." exit 1 fi log_ok "Kernel $(uname -r) compatível com eBPF sockmap" # ─── Instala pacotes ─── case "$DISTRO" in ubuntu|debian|linuxmint|pop) log_info "Instalando pacotes (apt)..." apt-get update -qq apt-get install -y \ clang \ llvm \ libbpf-dev \ linux-tools-common \ "linux-tools-$(uname -r)" \ linux-headers-"$(uname -r)" \ build-essential \ pkg-config \ curl \ docker.io \ docker-compose-plugin ;; fedora) log_info "Instalando pacotes (dnf)..." dnf install -y \ clang \ llvm \ libbpf-devel \ bpftool \ kernel-headers \ kernel-devel \ make \ gcc \ curl \ docker \ docker-compose-plugin ;; arch|manjaro) log_info "Instalando pacotes (pacman)..." pacman -Sy --noconfirm \ clang \ llvm \ libbpf \ bpf \ linux-headers \ base-devel \ curl \ docker \ docker-compose ;; *) log_warn "Distribuição '$DISTRO' não reconhecida." log_warn "Instale manualmente: clang, llvm, libbpf-dev, bpftool, linux-headers, docker" ;; esac # ─── Verifica ferramentas instaladas ─── echo "" log_info "Verificando ferramentas..." check_tool() { if command -v "$1" &>/dev/null; then log_ok "$1 → $($1 --version 2>&1 | head -1)" else log_error "$1 não encontrado!" return 1 fi } check_tool clang check_tool llc check_tool bpftool || log_warn "bpftool pode estar em /usr/lib/linux-tools/$(uname -r)/bpftool" check_tool docker # ─── Verifica BTF (BPF Type Format) ─── echo "" if [ -f /sys/kernel/btf/vmlinux ]; then log_ok "BTF disponível em /sys/kernel/btf/vmlinux" else log_error "BTF não encontrado! O kernel precisa ser compilado com CONFIG_DEBUG_INFO_BTF=y" log_error "A maioria das distros modernas já inclui BTF." fi # ─── Verifica cgroup v2 ─── if mount | grep -q "cgroup2"; then log_ok "Cgroup v2 ativo" else log_warn "Cgroup v2 não detectado! Pode ser necessário para o sockmap." log_warn "Adicione 'systemd.unified_cgroup_hierarchy=1' aos parâmetros de boot do kernel." fi # ─── Configura Docker ─── echo "" log_info "Configurando Docker..." systemctl enable docker 2>/dev/null || true systemctl start docker 2>/dev/null || true # Adiciona usuário atual ao grupo docker (se não é root direto) ACTUAL_USER="${SUDO_USER:-$USER}" if [ "$ACTUAL_USER" != "root" ]; then usermod -aG docker "$ACTUAL_USER" 2>/dev/null || true log_ok "Usuário '$ACTUAL_USER' adicionado ao grupo docker" log_warn "Faça logout e login para o grupo docker funcionar sem sudo" fi echo "" echo -e "${GREEN}═══════════════════════════════════════════════${NC}" echo -e "${GREEN} Instalação concluída!${NC}" echo -e "${GREEN}═══════════════════════════════════════════════${NC}" echo "" echo "Próximos passos:" echo " 1. make → Compilar o programa eBPF" echo " 2. make docker-up → Subir os containers" echo " 3. make load → Ativar o sockmap" echo " 4. make benchmark → Testar performance" echo ""