Lançamento do núcleo Linux 6.9

Após dois meses de desenvolvimento, Linus Torvalds apresentou o lançamento do núcleo Linux 6.9. Entre as mudanças mais notáveis estão: o módulo dm-vdo para desduplicação e compressão de dispositivos de bloco, o modo de acesso direto a arquivos no FUSE, suporte para a criação de pidfd para threads individuais, um mecanismo BPF-token e suporte ao Rust em sistemas ARM64, a classificação do sistema de arquivos Ext2 como obsoleto, a remoção do antigo driver NTFS e suporte ao mecanismo Intel FRED.

A nova versão contém 15.680 correções de 2.106 desenvolvedores, com um tamanho de patch de 54 MB (as mudanças afetaram 11.825 arquivos, com 687.954 linhas de código adicionadas e 225.344 linhas removidas). A versão anterior teve 15.641 correções de 2.018 desenvolvedores, com um tamanho de patch de 44 MB. Cerca de 42% de todas as mudanças apresentadas na versão 6.9 estão relacionadas a drivers de dispositivos, aproximadamente 17% se referem à atualização de código específico para arquiteturas de hardware, 13% estão relacionadas ao stack de rede, 7% às sistemas de arquivos e 4% às subsistemas internos do núcleo.

Principais inovações no núcleo 6.9:

  • Subsistema de disco, entrada/saída e sistemas de arquivos
    • No Device Mapper (DM), foi adicionado um novo manipulador dm-vdo (otimizador de dados virtual), que permite, com base em dispositivos de bloco existentes, criar um dispositivo de bloco virtual com funcionalidades como desduplicação de dados repetidos, compressão de dados, exclusão de blocos vazios e aumento do tamanho do dispositivo de bloco conforme a necessidade (thin provisioning). As funcionalidades mencionadas são implementadas no nível do dispositivo de bloco e não dependem do sistema de arquivos utilizado (por exemplo, com o dm-vdo, é possível implementar a junção automática de dados duplicados e o armazenamento de informações de forma compactada para qualquer sistema de arquivos). O uso do dm-vdo é suportado para armazenamentos físicos com tamanho de até 256TB, e a criação de volumes lógicos de até 4PB. Para gestão de partições vdo, recomenda-se utilizar lvm. A tecnologia VDO foi desenvolvida pela Permabit e foi aberta após sua aquisição pela Red Hat em 2017.
    • No subsistema FUSE, usado para implementar sistemas de arquivos no espaço do usuário, foi adicionada a implementação inicial do modo "passthrough", permitindo acesso direto a dados de arquivos no nível do kernel, contornando o processo que opera no espaço do usuário, o que pode aumentar significativamente o desempenho em certas situações. Por exemplo, as implementações de FUSE de FS que operam em modo somente leitura e restringem o acesso a arquivos podem fornecer o conteúdo dos arquivos da FS original sem transferi-los para o processo FUSE.
    • O driver com a implementação do sistema de arquivos Ext2 foi classificado como obsoleto (deprecated). A razão citada é o suporte no driver apenas para contadores de tempo de 32 bits em inodes, que irão transbordar em 19 de janeiro de 2038. Recomenda-se usar o driver ext4, que suporta operações com o sistema de arquivos Ext2 e é completamente compatível, mas pode utilizar timestamps nos volumes ext2 que não são afetados pelo problema de 2038, se o FS for criado com inodes maiores que 255 bytes (no driver ext2, contadores de tempo de 32 bits eram utilizados independentemente do tamanho do inode).
    • O antigo driver do sistema de arquivos NTFS foi removido, sendo substituído a partir da versão 5.15 pelo novo driver NTFS3. A inclusão de dois drivers com a implementação do NTFS no kernel foi considerada inadequada, uma vez que o antigo driver não era atualizado há muitos anos, encontra-se em estado deplorável e só pode operar em modo de leitura.
    • Foi adicionada ao sistema de arquivos zonefs e hugetlbfs a supporte para mapeamento de identificadores de usuários em sistemas de arquivos montados, que é utilizado para associar arquivos de um determinado usuário em uma partição montada de outro usuário com outro usuário no sistema atual.
    • No NFSv4, foi fornecida aos administradores a capacidade de limpar estados de abertura e bloqueio de arquivos.
    • Para o sistema de arquivos Ext4, somente correções de bugs e atualização dos testes kunit foram realizados.
    • No Btrfs, a continuação da tradução de funções para o uso de folhetos de páginas de memória (page folios) foi realizada.
    • No sistema de arquivos XFS, continuam os esforços para implementar a utilização da ferramenta fsck para verificar e corrigir problemas identificados em modo online, sem a necessidade de desmontar o sistema de arquivos.
    • A chamada de sistema pwritev2() agora inclui a flag RWF_NOAPPEND, que permite especificar um deslocamento para a gravação, mesmo que o arquivo tenha sido aberto em modo de adição de dados ao final do arquivo.
    • Novos comandos ioctl foram adicionados: FS_IOC_GETUUID — retorna o identificador UUID do sistema de arquivos especificado, e FS_IOC_GETFSSYSFSPATH — define a localização em /sys/fs do sistema de arquivos montado especificado.
    • Os sistemas de arquivos efs, qnx4 e coda foram convertidos para utilizar a nova API de montagem de partições.
    • A implementação de operações em arquivos realizadas em modo sem distinção de maiúsculas e minúsculas foi aprimorada. O desempenho foi melhorado ao realizar inicialmente a comparação sensível a maiúsculas e revertendo para uma busca sem distinção de maiúsculas e minúsculas. Problemas ao montar overlayfs sobre diretórios com modo sem distinção de maiúsculas e minúsculas foram resolvidos.
  • Memória e serviços do sistema
    • Foi implementado o suporte ao mecanismo Intel FRED (Flexible Return and Event Delivery), criado para aumentar a eficiência e confiabilidade da entrega de informações sobre eventos de baixo nível, em comparação com o mecanismo atualmente utilizado IDT (Interrupt Descriptor Table). O aumento do desempenho e a redução das latências são garantidos pelo retorno de eventos pela instrução do processador IRET, em vez de transmitir eventos através da tabela IDT. A confiabilidade é aumentada devido ao tratamento separado da entrada de eventos no contexto do núcleo e no contexto do usuário, proteção contra execução aninhada de NMI e a preservação em um quadro de pilha estendida de todos os registradores da CPU relacionados à exceção.
    • Foi adicionada a habilidade de otimizar o acesso a dados de núcleos individuais da CPU usando, no código do núcleo, espaços de endereço nomeados (Named Address Spaces), implementados no GCC na forma de uma extensão GNU C.
    • Foi adicionada a flag PIDFD_THREAD à função pidfd_open(), permitindo a criação de pidfd para threads individuais, e não apenas o uso de pidfd no contexto do líder do grupo de threads. Também foi proposta a implementação de um pseudo-sistema de arquivos para acessar pidfd através do sistema de arquivos virtual. Ao contrário da identificação de processos por meio do pid, o identificador pidfd está vinculado a um processo específico e não muda, enquanto o PID pode ser vinculado a outro processo após a conclusão do processo atual.
    • O subsistema BPF foi adicionado um mecanismo de tokens BPF que permite delegar seletivamente programas de direitos de acesso a operações privilegiadas do BPF. Por exemplo, é possível conceder a um aplicativo não privilegiado acesso a subsistemas BPF específicos sem conceder direitos completos CAP_BPF.
    • O subsistema BPF introduziu um novo tipo de memória compartilhada bpf_arena, que define uma área acessível para compartilhamento entre programas BPF e processos no espaço do usuário. Foi adicionada a instrução may_goto, que permite organizar o funcionamento de loops que podem ser interrompidos pelo verificador. Agora é possível gerar cookies TCP SYN aleatórios a partir de programas BPF e criar manipuladores BPF para combater o SYN flood.
    • O processo de transferência de mudanças da ramificação Rust-for-Linux continuou, relacionado ao uso da linguagem Rust como segunda linguagem para o desenvolvimento de drivers e módulos do núcleo (o suporte ao Rust não está ativo por padrão e não leva à inclusão do Rust nas dependências de compilação obrigatórias do núcleo). Foi adicionado o suporte ao uso da linguagem Rust em processadores ARM de 64 bits. A transição para o uso da versão Rust 1.76 foi realizada. O macro ‘container_of!’ foi adicionado. Em vez da funcionalidade instável ‘ptr_metadata’, foi utilizado o método estável ‘byte_sub’. Um módulo ‘time’ foi adicionado com a função de conversão de tempo ‘msecs_to_jiffies()’.
    • O subsistema io_uring agora suporta o truncamento de arquivos (ftruncate_file).
    • Foi adicionado um novo tipo de filas de trabalho WQ_BH (workqueue Bottom Halves) para a execução assíncrona de código no contexto de interrupções de software, direcionado ao uso em vez dos obsoletos tasklets.
    • O subsistema de gerenciamento de timers foi significativamente reestruturado, melhorando a lógica de seleção do núcleo ativo da CPU para a execução do timer acionado, para evitar despertar núcleos inativos.
    • Foi implementada a capacidade de atualização do modelo de consumo de energia do núcleo (EM, Energy Model) durante a operação, o que pode ser usado, por exemplo, para levar em conta o impacto da temperatura de operação na eficiência energética da CPU. O desempenho da função em_cpu_energy() foi significativamente melhorado, sendo agora 1,43 vezes mais rápida em testes em sistemas estacionários, e em testes na placa RockPi 4B, 1,69 vezes mais rápida.
    • Adicionada a suporte para execução de sistemas com arquitetura ARM64 no modo LPA2 com espaço de endereçamento virtual de 52 bits.
    • Para sistemas ARM64, foi implementado o suporte para registros contínuos PTE (Page Table Entry), permitindo melhorar o desempenho por meio da maior eficiência na utilização do TLB (Translation Lookaside Buffer).
    • Foram aceitos patches para aumentar o desempenho do subsistema de gerenciamento de memória ao reduzir a ocorrência de bloqueios concorrentes em vmalloc().
    • Para a arquitetura LoongArch, foi implementado um mecanismo de patching ao vivo no kernel, permitindo aplicar correções ao kernel sem reiniciar.
    • Para sistemas RISC-V, foi implementado o suporte para a chamada de sistema membarrier(), que garante a instalação de barreiras de memória para threads em execução no sistema.
    • As exigências para a versão do LLVM/Clang que pode ser usada para compilar o kernel foram elevadas. Agora, é necessário pelo menos a versão 13.0.1 do LLVM (anteriormente, a compilação era suportada a partir do LLVM 11+).
    • No mecanismo 'User trace events', que permite criar eventos de rastreamento a partir de processos de usuário para monitorar atividades no espaço do usuário, foi adicionado o suporte para exportar informações sobre eventos em vários formatos (USER_EVENT_REG_MULTI_FORMAT).
    • No mecanismo de rastreamento de chamadas de função, foi adicionada a capacidade de rastrear o estado dos argumentos de entrada da função ao rastrear a saída da função. Os valores do operador return agora podem ser associados aos argumentos utilizados na chamada da função.
    • Na ferramenta perf, foi adicionada a suporte para o modo de agregação de saída 'cluster' ('perf stat -a —per-cluster') para combinar estatísticas de recursos compartilhados. Implementada a possibilidade de utilizar a biblioteca libcapstone para desassemblar instruções de processador ('perf script -F disasm'). Foram realizadas otimizações no consumo de memória durante a execução dos comandos perf report e perf annotate.
  • Virtualização e segurança
    • Foi adicionada proteção contra a vulnerabilidade RFDS (Register File Data Sampling) em processadores Intel Atom, permitindo a extração de informações residuais dos arquivos de registro (RF, Register File) do processador, que são usados para armazenar o conteúdo dos registros em todas as tarefas no mesmo núcleo da CPU. Para bloquear a vulnerabilidade, é necessária uma atualização de microcódigo e o uso da instrução VERW para limpar o conteúdo dos buffers microarquiteturais ao retornar do núcleo para o espaço do usuário. Para ativar a proteção durante a inicialização do núcleo, pode-se especificar a flag "reg_file_data_sampling=on". Informações sobre a exposição à vulnerabilidade e a presença do microcódigo necessário para a proteção podem ser avaliadas no arquivo "/sys/devices/system/cpu/vulnerabilities/reg_file_data_sampling".
    • Foi adicionada suporte básico à proteção de sistemas convidados com a extensão AMD SEV-SNP (Secure Nested Paging), que garante um funcionamento seguro com tabelas de páginas de memória aninhadas e protege contra ataques "undeSErVed" e "SEVerity" em processadores AMD EPYC, que podem contornar o mecanismo de proteção AMD SEV (Secure Encrypted Virtualization). KVM As mudanças necessárias para utilizar o SNP estão planejadas para serem adicionadas na ramificação 6.10.
    • Módulos com implementação das tecnologias IMA (Integrity Measurement Architecture) e EVM (Extended Verification Module) foram adaptados para usar a estrutura LSM (Linux Security Modules), o que, sem perda de funcionalidade, permitiu simplificar consideravelmente o código, unificar funcionalidades duplicadas e empregar recursos típicos disponíveis via LSM. O módulo IMA é destinado à verificação da integridade dos componentes do sistema operacional por meio de assinaturas digitais e hashes. O módulo EVM protege atributos estendidos de arquivos (xattrs) contra ataques voltados a comprometer sua integridade (o EVM não permitirá a realização de um ataque offline, onde um invasor pode modificar metadados, por exemplo, inicializando a partir de seu próprio dispositivo).
    • Chamadas de sistema lsm_list_modules(), lsm_get_self_attr() e lsm_set_self_attr() foram refeitas para maior compatibilidade com ambientes de 32 bits, destinadas a listar os módulos LSM (Linux Security Modules) carregados e obter/exibir atributos do módulo LSM. A alteração quebra a compatibilidade retroativa, mas como novas chamadas de sistema foram adicionadas na versão anterior do núcleo e ainda não estão sendo utilizadas em aplicativos, Linus Torvalds considerou que a mudança é aceitável.
    • Foi feita uma tentativa de retomar o uso do mecanismo UBSAN (Undefined Behavior Sanitizer). A essência do problema é que os compiladores tratam de maneira diferente as transbordas inteiras de tipos com e sem sinal. Transbordas com sinal e transbordas de ponteiros pertencem à categoria de comportamento indefinido, enquanto transbordas sem sinal são tratadas módulo 2n, preservando apenas os bits menos significativos do resultado ("wrap-around") e não se enquadram no comportamento indefinido. Para evitar situações que resultem em comportamento indefinido, o núcleo é compilado com a opção "-fno-strict-overflow", que leva ao uso de "wrap-around" para todos os transbordos inteiros. GCC e Clang não conseguem diagnosticar corretamente alguns problemas com a flag "-fno-strict-overflow" e a inclusão do UBSAN visa realizar um trabalho conjunto com os desenvolvedores de compiladores para eliminar falsos positivos e identificar transbordos inteiros em locais onde não há verificações explícitas.

      Para verificar possíveis transbordos no núcleo, são utilizadas construções do tipo "var + offset PAGE_SHIFT) < pgoff){..}"), que estão ligadas à compilação com a flag "-fno-strict-overflow" e não cobrem todo o código onde um transbordo pode ocorrer potencialmente. O problema é que, ao usar o UBSAN, essas verificações geravam uma quantidade significativa de avisos falsos, e por isso, em 2021, o UBSAN teve que ser desativado. Na implementação atualizada, foi proposto o uso de anotações especiais __signed_wrap e __unsigned_wrap, bem como macros com verificações add_would_overflow(a, b) e add_wrap(a, b), permitindo separar o uso intencional de transbordos inteiros por parte dos desenvolvedores de eventuais transbordos acidentais que possam levar a vulnerabilidades. A proposta de uma reforma mais abrangente do núcleo com a introdução de definições adicionais de tipos foi rejeitada por Linus Torvalds.

  • Subsistema de Rede
    • Na subsistema de rede, foram realizadas ações para reduzir a ocorrência de contenções de bloqueio ("lock contention", tentativa de obter um bloqueio mantido por outro thread). O uso de bloqueios RTNL foi reduzido.
    • Adicionada a possibilidade de ativar o suporte a polling ativo de sockets (busy polling) no contexto de chamadas epoll individuais. O tamanho do pool e os parâmetros de orçamento podem ser definidos separadamente dos parâmetros do sistema por padrão.
    • Implementada a estrutura net_hotdata para aumentar a eficácia do cache das variáveis de configuração de rede mais frequentemente utilizadas.
    • No MPTCP, foi adicionado suporte para configurar para sockets a opção TCP_NOTSENT_LOWAT, permitindo limitar o tamanho do buffer de envio. Na API para sockets MCTP, foi adicionado suporte para identificadores de rede ('network ID'), permitindo usar várias redes MCTP não sobrepostas em um único host.
    • No IPSec, adicionado suporte para redirecionar mensagens ICMP com informações de erro (RFC 4301).
    • Acelerado o processo de escaneamento de rotas com tempo de vida expirado.
    • O desempenho do XDP foi acelerado, graças à maior rigidez em evitar a alocação de grandes blocos de memória.
    • Adicionada a possibilidade de anexar metadados a mensagens netconsole.
    • No Netfilter, permitida a definição a partir do espaço do usuário de tabelas que se conectam ao processo de fundo de controle e não são removidas automaticamente após a conclusão do aplicativo do usuário.
    • No nftables, acelerado o processo de adição de elementos em conjuntos set com intervalos combinados.
  • Hardware
    • No driver i915, continuada a implementação do suporte para chips Intel LunarLake (Xe 2). Novos identificadores PCI adicionados para dispositivos baseados nos chips Intel Arrow Lake e Alder Lake N. Para Displayport, adicionado suporte para tunelamento (DP tunneling) e alocação de largura de banda (bandwidth allocation). Para todas as plataformas, o modo fastboot foi ativado. Adicionado suporte para saída de depuração vinculada a dispositivos específicos.
    • No driver AMDGPU, realizada a preparação para a implementação do suporte para GPU AMD RDNA3.5 e RDNA4. Adicionado suporte para ATHUB 4.1, LSDMA 7.0, JPEG DPG, IH 7.0, HDP 7.0, VCN 5.0, SMU 13.0.6, NBIO 7.11, SDMA 6.1, MMHUB 3.3, DCN 3.5.1, NBIF 6.3.1, VPE 6.1.1 e do framework RAS ACA. No módulo do kernel, adicionado o parâmetro freesync_video para ativar o suporte experimental à otimização de troca de modos de vídeo usando a tecnologia de sincronização adaptativa FreeSync.
    • No driver Nouveau, o código de gerenciamento de tela foi transferido para utilização da função kmemdup().
    • Continuou o trabalho no driver drm (Direct Rendering Manager) Xe para GPUs baseadas na arquitetura Intel Xe, que são utilizadas nas placas gráficas Intel da família Arc e na gráfica integrada, começando com os processadores Tiger Lake.
    • Adicionado o driver DRM para os chips Mediatek MT8188 VDOSYS1.
    • As configurações relacionadas ao subsistema de vídeo foram transferidas para a seção CONFIG_VIDEO.
    • Adicionada suporte para ARM64 SoC: Mediatek MT7981B (Filogic 820), MT7988A (Filogic 880), NXP i.MX8DXP, Renesas R8A779G2 (R-Car V4H ES2.0), R8A779H0 (R-Car V4M), TI J722S.
    • Adicionada suporte para placas e dispositivos ARM: telefones Android baseados no chip Tegra30, modelos de Chromebook baseados no Mediatek MT8186, NAS, tablets e consoles de jogos baseados em Rockchips RK35xx, placas White Hawk baseadas em SoC Renesas, placas baseadas em Qualcomm SM8550 (Snapdragon 8 Gen 2), Apalis Evaluation Board, Sielaff i.MX6 Solo Board, Samsung Galaxy Tab 4 10.1 LTE.
    • Realizada a refatoração do código do subsistema de áudio ALSA. Adicionada suporte para sistemas de áudio Microchip SAM9x7, NXP i.MX95 e Qualcomm WCD939x. No driver SoundWire, foi adicionada suporte ASoC com coprocesadores de áudio AMD ACP 6.3, e para sistemas Intel, foi implementado o modo DSPless. Adicionada suporte para codecs de áudio adicionais Cirrus HD. No driver virtio, melhorou-se o controle dos dispositivos de áudio.
    • Adicionada suporte para controladores Ethernet Marvell Octeon PCI Endpoint NIC VF e Intel E825-C 100G.

Simultaneamente, a Fundação Latino-Americana de Software Livre formou uma versão completamente livre do kernel 6.9 — Linux-libre 6.9-gnu, limpa de elementos de firmwares e drivers que contêm componentes não livres ou trechos de código cuja área de aplicação é limitada pelo fabricante. Na versão 6.9, foi atualizado o código de limpeza de blobs nos drivers amdgpu, ath12k, adreno, btusb e r8169. Realizada a limpeza do novo driver ptp_fc3. Realizada a limpeza dos nomes dos blobs nos arquivos dts (devicetree) para a arquitetura Aarch64. Corrigidos problemas com a limpeza do driver i915 que causavam travamentos durante a inicialização. Alterações foram feitas no tratamento dos blobs fornecidos em forma de dumps hexadecimais.

Fonte: opennet.ru

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster