Objetivo de Minimização do Fedora

Proposta de Segunda Fase

Líder do objetivo: Adam Samalik (asamalik)

O problema

Embora o Fedora seja bem adequado para estações de trabalho e servidores físicos/virtuais tradicionais, é frequentemente esquecido para casos de uso além das instalações tradicionais.

Alguns tipos modernos de implantações – como IoT e contêineres – são bastante sensíveis ao tamanho. Para IoT, isso geralmente é lento para conexões de dados (para atualizações/gerenciamento) e para nuvem e contêineres é a escala maciça.

Um exemplo específico é o Systemd – embora seja muito útil (todo mundo adora o Systemd) e esteja sempre presente em sistemas físicos, raramente é necessário em contêineres. Portanto, não era um problema para os pacotes exigirem o Systemd apenas para systemd-sysusers para criar usuários. No entanto, em contêineres, isso significa um aumento significativo de tamanho.

Além disso, basicamente todos os tipos de implantações se beneficiam de um tamanho reduzido, pois há uma relação direta entre a área de cobertura da instalação e a superfície de ataque e os CVEs relevantes.

Visão

Milhares de colaboradores individuais e corporativos colaboram com a comunidade Fedora para explorar novos problemas e construir um sistema operacional moderno e veloz com um rico ecossistema que lhes permite experimentar a modernização de sua infraestrutura.

Missão

Ajudar os desenvolvedores de código aberto, administradores de sistemas e mantenedores de distribuição do Linux a se concentrarem no que é relevante para eles.

Resultados

O Fedora é uma plataforma popular porque seu ecossistema é de ponta e bem otimizado para implantações modernas, como IoT e contêineres. Isso faz com que muitas pessoas usem o Fedora em vez de construir e montar seus próprios artefatos diretamente de projetos upstream. E isso alivia a pressão sobre os desenvolvedores de código aberto causada por usuários que, de outra forma, solicitariam que sua segurança específica e outros problemas fossem corrigidos rapidamente.

De forma que:

  • Os desenvolvedores de código aberto podem se concentrar no desenvolvimento de recursos

  • Os administradores de sistemas podem facilmente consumir bits pré-compilados que também recebem atualizações regulares

  • Contribuidores do Fedora (fornecedores e indivíduos) podem colaborar com a comunidade Fedora na exploração e desenvolvimento de soluções de código aberto para problemas do futuro

Saídas

Casos de uso específicos são definidos no Fedora. A comunidade então se concentra nesses casos de uso com desenvolvimento e manutenção, otimização (como minimização) e teste (como CI e gating). Esses casos de uso podem ser priorizados de forma transparente para recursos de infraestrutura com base nos interesses da comunidade.

O Feedback Pipeline monitora ativamente cada caso de uso e registra o tamanho e as dependências necessárias para sua execução. O histórico de dados é mantido e mostrado para ver as mudanças ao longo do tempo. E para manter as coisas pequenas ao longo do tempo, o Feedback Pipeline também detecta automaticamente aumentos de tamanho e, potencialmente, abre bugs do Bugzilla automaticamente para rastrear/corrigir/justificar tais aumentos de forma transparente.

Um foco ativo na minimização significa que nossos mantenedores produzem conteúdo de tamanho otimizado com o mesmo esforço ou menos. Ferramentas, serviços e dados os ajudam a tomar a decisão certa sobre dependências facilmente e a manter as coisas menores com o tempo.

Ações

Identificar os casos de uso relevantes e permitir que a comunidade (ou seja, não apenas a equipe de minimização) defina os seus próprios. Pensamos em um caso de uso como um conjunto de pacotes instalados em um contexto específico, tendo um propósito específico – como Apache HTTP Server Container. Definir casos de uso pelo menos para:

  • httpd

  • nginx

  • MariaDB

  • PostgreSQL

  • Fedora IoT

  • Python 3

Além disso, considere examinar casos de uso nativos de contêiner, como:

  • GO para aplicativos de contêineres

  • Rust para aplicativos de contêineres

  • Quarkus

Coletar casos de uso específicos conversando com pessoas em eventos de tecnologia, fóruns na Internet e quaisquer outros locais viáveis.

Estender os serviços de monitoramento (Feedback Pipeline) que:

  • Visualizam dependências e um tamanho total para cada caso de uso

  • Monitoram as mudanças de tamanho ao longo do tempo

  • Detectam automaticamente alterações de tamanho grande

  • Notificam os mantenedores sobre aumentos inesperados de tamanho

Além dos recursos, também precisamos:

  • escrever testes para simplificar significativamente a contribuição

  • fazer otimizações de desempenho para o serviço escalar bem

  • explorar o uso de CI e Rawhide Gating

Ser capaz de ver o que está acontecendo é um pré-requisito para implementar qualquer mudança. Ver todas as oportunidades relevantes nos ajuda a focar nas que têm mais impacto, e um acompanhamento transparente nos ajuda a provar a utilidade do nosso trabalho e a focar ainda mais nas atividades mais impactantes.

Minimizar o tamanho da instalação dos casos de uso, otimizando dependências RPM, recursos, arquitetura de software e outros fatores. Especificamente, procurar:

  • Dependências RPM desnecessárias (embora provavelmente não haja muitas)

  • Várias implementações da mesma funcionalidade exigidas por vários pacotes – tentar fazê-los usar o mesmo

  • Requisitos específicos do contexto – tal como exigir de Systemd em implantações tradicionais estar certo em com paração com exigir em contêineres significa aumentos significativos de tamanho. Aproveitar as dependências fracas nesses casos (que podem exigir alterações no código).

  • Dependências de coisas grandes enquanto usa apenas uma fração da funcionalidade – como exigir que toda a pilha Perl execute um único script - esse script pode ser reescrito para Python, que está em todo lugar principalmente por causa do DNF

Envolver-se com desenvolvedores de upstream em relação a mudanças maiores no pacote e na arquitetura. Um exemplo é o Systemd e a divisão do pacote systemd-sysuser.

Implementar mudanças de processo e política refletindo mudanças maiores e mais gerais. Novamente, um bom exemplo é o uso do Systemd em contêineres ou a questão geral de criar usuários em contêineres.

Fornecer orientação para a comunidade Fedora na forma de publicações de blog, vídeos e palestras. Mesmo que possamos ter diretrizes e políticas em vigor, espalhar a palavra é sempre importante.

Recursos e Entradas

Recursos de nuvem para serviços de protótipo. Não vamos mudar a infraestrutura existente do Fedora de forma alguma antes que tudo o que desenvolvemos se mostre útil e valha a pena o esforço de estabilização e mudança de produção.

Nenhum recurso existente de Infra ou de Engenharia de Lançamento do Fedora é necessário no momento. No entanto, podemos precisar de ajuda para configurar (ou obter acesso aos) recursos de nuvem.

O apoio ativo de nossos mantenedores, o FPC e outros membros da comunidade é definitivamente necessário. Obviamente, isso não é algo que possamos "solicitar", mas ainda é uma entrada necessária.

Princípios Orientadores

Usefulness over size: There is a balance between the usefulness and size. We take that in mind and will not implement drastic changes that would prevent our users from using Fedora. However, nothing prevents us from producing additional very specific and minimal artifacts.

Usando RPM: Estamos fazendo isso com RPM. Não estamos alcançando a minimização excluindo arquivos após a instalação. Isso pode ser óbvio, mas ainda assim vale a pena mencionar.

Realizações da Primeira Fase

Veja a página de status para informações detalhadas e atualizações semanais históricas. Resumo abaixo.

Melhor compreensão – Sim, agora temos uma compreensão muito melhor do problema e uma ideia melhor e mais específica sobre as próximas etapas.

Feedback Pipeline – Um serviço que monitora casos de uso para tamanho e dependências. Inclui várias visualizações em tabelas e gráficos de dependência interativos.

Systemd e contêineres – abordamos a questão de Systemd vs. contêineres, especialmente para pacotes que exigem apenas para criar usuários em contêineres usando systemd-sysuser. Trabalhar com o upstream na divisão do pacote. Pensei, mas ainda não propus, uma política mais ampla em torno disso.

Pensamento sobre políticas:

  • A - Se o systemd for necessário apenas para iniciar os serviços, um pacote deve apenas "Recomendar" o systemd. Isso permitirá que os contêineres instalem o pacote sem o systemd.

  • B - Se um programa está usando apenas uma biblioteca do systemd, requerer apenas o systemd-libs. Exemplo: libusb

  • C - Se um pacote deseja usar systemd-sysusers para criar usuários/grupos, requerer apenas systemd-sysusers. (NOTA: este subpacote ainda não foi implementado)

initial-setup — If an image is built without users, there needs to be some way to add a user at startup.  initial-setup does a good job of that, but at the expense of size.  It pulls in anaconda-tui and anaconda-core.  Those two packages then commence to pull in a lot of other, rather large, packages. This is for the IoT images, as well as others. We currently do not have a recommendation, but it is being worked on.

Usar pcre2 em vez de pcre – O esforço de minimização está tentando cortar coisas em apenas um pcre, que é pcre2.

Polkit and mozjs60 — Let’s explain this one with a terrible analogy! Polkit is this lovely person (.5M) that rings your doorbell and says they will wash the windows of your house.  After you agree, they bring out their elephant (mozjs60 30M) and use it to spray your windows with water. Polkit pulls in mozjs60, which is a rather large package. So, we’re trying to sort this one out, too.