167 lines
5.4 KiB
Bash
167 lines
5.4 KiB
Bash
#!/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 ""
|