Projeto OpenBSD
Uma Visão Geral
Pedro Martelletto
The OpenBSD Project
23 de Julho de 2005, Coimbra, Portugal
(page 1)
- Projeto conta atualmente com 127 desenvolvedores ativos
- Última versão é a 3.7, lançada em 19 de Maio de 2005
- OpenBSD c2k5 reuniu 60 desenvolvedores de 15 nacionalidades \
- diferentes em Calgary, Canadá, para uma sessão intensa de \
- hacking de 7 dias
- MUITO pouco sono
- MUITO produtivo
- Próxima versão será lançada em meados de Novembro, code-freeze \
- provavelmente uns dois meses antes (Setembro)
(page 2)
Aviso
c2k5
(page 3)
ho, naddy, pedro, matthieu, papai noel, camield e joris
c2k5
(page 4)
marc, claudio, alguém e moritz
c2k5
(page 5)
pedro, tdeval e wim
c2k5
(page 6)
dale, tedu, jason, art, dlg e uwe
(page 7)
Desde o último meeting do OpenBSD-PT, muita coisa aconteceu...
- Suporte a quatro novas plataformas
- luna88k
- Extensão do port existente para arquitetura mvme88k \
- para suportar a linha de computadores 88100-based da \
- Omron
- sgi64
- Suporte a estações O2 SGI 64 bits
- solbourne
- Plataformas 'sparc-like' feitas pela \
- Solbourne (mesmo conjunto de instruções, MMU \
- completamente diferente)
- zaurus
- Séries Zaurus C3000 e C3100 de PDAs feitos pela Sharp
- Processador ARM-like
- Port que mais tem crescido em escala (suporte a USB, \
- wireless, áudio, suspensão, etc)
(page 8)
Zaurus C3000 rodando OpenBSD
(page 9)
- Suporte a SMP nas arquiteturas i386 e amd64
- Estágio ainda muito prematuro
- Big-lock (somente um processo pode estar no kernel \
- em um dado instante)
- Muitas vezes o uso de SMP acaba por afetar a \
- performance negativamente (especialmente em amd64)
- HyperThreading funciona em determinadas configurações
- Nova implementação de mutex entre processadores feita \
- por Artur Grabowski (art@), ainda não usada no momento
- API simples: mtx_init(), mtx_enter(), mtx_leave()
- Eficiente: "casca" em C, implementação em Assembly
- Separação e redução de privilégios nos seguintes daemons
- afsd(8), mopd(8)
- pppoe(8), rbootd(8), ftpd(8)
- dhcrelay(8), dhclient(8) e dhcpd(8), que tiveram seus \
- códigos enxugados consideravelmente pelo Henning Brauer
(page 10)
- gcc3 nas plataformas i386 e amd64
- StackGhost para a plataforma sparc64
- Impacto mínimo em performance (~3%)
- strtonum(), uma nova função para a conversão segura e rápida \
- de strings em números
- Maior cuidado com signal handlers e reentrância de funções
- Suporte inicial a ACPI e Bluetooth
- Suporte a PPPoE no kernel
- XFree86 foi substituído pelo Xorg
(page 11)
Alguns novos drivers...
- ehci(4), controladoras USB 2.0
- san(4), controladoras de rede T1 e E1
- axe(4), controladoras de rede USB 2.0
- cdce(4), rede sobre bridges USB
- re(4), controladoras de rede Realtek Gigabit
- atw(4), placas wireless com chipsets ADMtek8211
- ath(4), placas wireless com chipsets Atheros 5210, 5211 ou 5212
- rtw(4) placas wireless com chipset RTL8180
- ral(4), ural(4), placas wireless com chipset RT25x0
- iwi(4), ipw(4), placas wireless Intel PRO, diversos modelos
- atu(4), placas wireless USB com chipset Atmel
- udav(4), controladoras de rede USB
- vge(4), controladoras de rede Gigabit
- ubt(4), adaptadores USB Bluetooth
Entre outros...
(page 12)
Três novos daemons importantes...
- ntpd(8), um servidor de protocolo NTP
- ospfd(8), um servidor implementando o protocolo de roteamento OSPFv2 \
- (Open Shortest Path First)
- hotplugd(8), um daemon para auxiliar na anexação de novos devices após \
- o boot
(page 13)
... e melhorias nos daemons existentes
- spamd(8)
- Integração com o PF
- Otimização do processo de grey/white listing
- Possibilidade de se adicionar 'spamtraps'
- Avanços no bgpd(8)
- Conjunto de regras agora fica na memória
- Maior integração com o PF e o CARP
- Labels BGP podem ser usados em regras de firewall
- Diminuição do tempo de fail-over em setups \
- redundantes
- Implementação de novos protocolos de extensão
- Comunidades BGP e updates locais/remotos \
- (RFC1997)
- Route Reflection (RFC2796)
- Route Refresh Capability (RFC2918)
(page 14)
Três novas versões do OpenSSH (3.9, 4.0, 4.1)
- 'Session Multiplexing'
- Uma mesma sessão SSH pode carregar múltiplas sessões de \
- login/comandos/transferências
- Instanciação de um novo sshd(8) a cada nova conexão, \
- permitindo aplicações múltiplas das proteções oferecidas \
- pelo OpenBSD (embaralhamento da ordem e dos endereços de \
- bibliotecas compartilhadas, de mapeamentos mmap e malloc, \
- StackGhost e ProPolice)
- Melhorias de performance no sftp(1) e no ssh-keygen(1)
- known_hosts agora pode ser 'hashed', para maior privacidade
(page 15)
No PF (Packet Filter)...
- Otimizador de regras
- Em um conjunto relativamente grande de regras (~1 mil), \
- permite ganho de até 40% em performance
- Possibilidade de se limitar hosts de acordo com a taxa de \
- estabelecimento de conexões TCP deste e de outros hosts (melhor defesa \
- contra ataques DDoS)
- Grupos de interfaces para facilitar a gestão das mesmas
- Suporte a 'nested anchors' (anchors dentro de anchors)
- Possibilidade de se filtrar de acordo com labels de roteamento \
- (ideal para usar com bgpd(8) e ospfd(8), entre outras ferramentas)
- Alguns fixes de estabilidade (uso correto de pools)
(page 16)
Na parte de sistemas de arquivos...
- Eliminação de três races em ufs_rename()
- Eliminação de dois races no NFS
- Suporte a um novo file system, o UDF, para ser usado em DVDs
- Possibilidade do OpenBSD vender DVDs no futuro?
- Fix de diversas operações que estavam sendo feitas sem lock ou, \
- pior ainda, com o lock feito incorretamente
- AFS, NTFS, vnd(4)
- Reconstrução de arrays RAID
- Implementação de VFSDEBUG, uma nova opção no kernel para 'debugar' \
- a parte de sistemas de arquivos
- Fix de TODOS os problemas que essa opção encontrou
(page 17)
Na parte de sistemas de arquivos...
- Melhorias no modo de espelhamento do ccd(4)
- Melhor handling de devices que 'desaparecem' (USB pendrives, memory \
- sticks, dispositivos removíveis em geral)
- Antes deixavam um 'stale mount point', muitas vezes causando \
- panics
- Agora ocorre o 'graceful unmount' dos mount-points associados \
- ao device, e o sistema continua a funcionar normalmente
- Alguns fixes no softdep
- Quando o modo de um inode mudar, esperar que ele seja \
- escrito no disco antes de reutilizá-lo
- Lidar com grandes diretórios corretamente, escrevendo \
- blocos pertencentes ao diretório antes do diretório em si
(page 18)
Na ports tree...
- Capacidade de se fazer 'upgrade' de pacotes
- Não é mais preciso desinstalar um pacote para o atualizar
- Dependências relativas ao processo de upgrade podem ser \
- resolvidas internamente pelo pkg_add(1)
- Novo formato e novas tags para o PLIST
- Maior robustez na hora de descrever o conteúdo e a \
- dinâmica de um pacote
- Possibilidade de se executar comandos especificos para \
- completar a instalação/desinstalação de um pacote
- Controle sobre quais bibliotecas e versões que um pacote espera encontrar (WANTLIB)
- Vários, vários ports novos...
(page 19)
Projetos Atuais
- Suporte a FireWire (tdeval@)
- Remodelagem do layer de physical mapping (pmap) para amd64 (art@)
- Novo modelo de threads (tedu@)
- Ainda NÃO são threads no kernel...
- Mas se aproxima um pouco disto, pois transforma algumas \
- diretivas de threading em system calls, fazendo o kernel \
- 'saber' discernir um pouco melhor um processo com \
- de um processo sem threads
- Melhora de performance significativa, sobretudo em SMP
- Otimização dos ciclos da CPU no idle loop (mickey@)
- Suporte a novos modelos da linha Zaurus (uwe@, drahn@)
(page 20)
Três novos daemons
- hostapd(8) (reyk@)
- Permite a comunicação entre diferentes pontos agindo como \
- access points num ambiente wireless
- Será usado na WTH (What the Hack) para a infra-estrutura \
- wireless de todo o evento em mais de 50 Soekris
- sasyncd(8)
- Permite a sincronização de estados relativos a IPSec em um \
- ambiente fail-over (como por exemplo o oferecido pelo carp(4))
- ifstated(8)
- Permite monitorar o estado de uma interface e associar \
- ações a determinados eventos (interface up, down, etc)
(page 21)
- mmap malloc() (tdeval@)
- Fazer com que malloc() passe a usar mmap() para alocar memória
- Melhor controle sobre permissões dadas às páginas (execução, leitura, escrita)
- Maior embaralhamento das páginas e dos chunks retornados
- Maior chance de haver páginas inválidas antes e após o \
- espaço alocado (maior fragmentação)
- Maior proteção contra heap-based overflows
- Buffer overflow encontrado no Xorg alguns dias atrás
- X tenta acessar além do espaço alocado
- X paga empresas de segurança para realizar auditorias \
- na sua base de código, e nenhuma até hoje tinha \
- encontrado esse bug
- Ponderação sobre se esta feature estará no 3.8 ou não
- Medo de haver aplicações com erros demais, o que as \
- tornaria impossíveis de usar no OpenBSD
(page 22)
- Integração do projeto Citrus (internacionalização)
- Fix de alguns problemas no softdep (pedro@)
- File systems snapshots (pedro@)
- Para fins de backup apenas (muitas vezes abrir o device \
- e ler não funciona, pois pega o disco em um estado \
- inconsistente, tal como no meio de um write, alocação/remocão de um inode (diretório ou novo arquivo), etc)
- Oferecer algum mecanismo de journaling (pedro@, tedu@, art@, marius@, \
- deraadt@, ...)
- Talvez algo nos moldes do que o Dragonfly faz?
- Talvez algo diferente, associado ao softdep?
- Background fscks NÃO são a solução
(page 23)
- Usar NFS com Jumboframes (marius@)
- Jumboframes são "pacotes gigantes", e são suportados por \
- algumas interfaces (sk(4), ti(4), e outras)
- Maior velocidade em conversações NFS
- Suporte para grandes quantidades de memória (jason@)
- Implementações distintas por arquitetura
- Em algumas, é uma simples questão de capacitar a MMU
- Em outras, a MMU é limitada, e mecanismos para burlar \
- essas limitações têm de ser buscados
- Tabelas de mapeamento de endereços 'altos' em \
- endereços 'baixos' (elegante, porém custoso)
- Solução específica para cada bus (pci, usb, \
- cardbus, etc)
- Mover getcwd(3) para dentro do kernel, com o intuito de acelerá-la (marius@)
- Requer que novos mecanismos sejam implementados \
- no cache da VFS, mas vale a pena
(page 24)
- Mais races a serem identificadas e consertadas no VFS (pedro@)
- ufs_rename()
- sched_fsync()
- Suporte a DRI (Direct Rendering Infrastructure, tedu@)
- Suporte a mais controladoras RAID gdt(4) (marco@)
- bioctl(8), nova ferramenta para manuseio de interfaces RAID
- Suporte a mais controladoras SCSI mpt(4) (marco@)
- Suporte a cardbus em amd64 (fgsch@)
(page 25)
E, finalmente, um novo projeto, o OpenCVS (jfb@ e joris@)
- Uma nova implementação de CVS (Concurrent Version System)
- 100% compatível
- Mais rápido
- Mais seguro
- Com possíveis extensões...
- Estágio ainda muito prematuro
- Faz checkouts e updates apenas
- Mas o progresso tem sido constante...
(page 26)
Considerações finais
Alguns projetos e idéias para o futuro...
- UBC
- Idéia alternativa de como unir os caches usados pela \
- VM e pelo Buffer Cache (art@)
- NFS node locking
- Fazer com que o código NFS use locking entre processos \
- (lockmgr()) para proteger suas operações (pedro@)
- Threads no kernel
- Fazer com que o kernel saiba enxergar e manipular \
- cada thread de maneira independente
- Remodelar a estrutura vnode de maneira a ser possível alocar \
- e dealocar vnodes de um pool de memória, para maior flexibilidade
(page 27)
- Jails (pedro@)
- Algo semelhante ao que o FreeBSD fez
- Processos em grupos isolados uns dos outros, em diferentes ambientes chroot(8), mas sem a limitação de um IPv4 por jail (colocar bridge(4)s em cima de cada jail?)
- Em vez de marcar um processo quando ele estiver dentro \
- de um jail, considerar TODO processo como estando dentro \
- de jail, a diferença sendo que uns processos ficariam em um jail \
- 'global' e outros não
- Limites por jail de utilização de CPU e de outros recursos do sistema também seriam interessantes
- Reimplementar os stackables filesystems de alguma maneira sana
- nullfs relativamente fácil
- unionfs e whiteouts é que são o problema
- Write support em sistemas de arquivos UDF
- Packet Writing (bom para outros file systems também)
(page 28)
- Estudo e eventual utilização do compilador do Plan 9
- Recentemente posto sob licença MIT e MUITO simples
(page 29)