Kernel Linux versão 5.15

Após dois meses de desenvolvimento, Linus Torvalds apresentou o lançamento do kernel Linux 5.15. Mudanças notáveis ​​incluem: novo driver NTFS com suporte para gravação, módulo ksmbd com implementação de servidor SMB, subsistema DAMON para monitoramento de acesso à memória, primitivos de bloqueio em tempo real, suporte fs-verity em Btrfs, chamada de sistema process_mrelease para memória de sistemas de resposta à fome, módulo de certificação remota dm-ima.

A nova versão inclui 13499 correções de 1888 desenvolvedores, o tamanho do patch é de 42 MB (as alterações afetaram 10895 arquivos, 632522 linhas de código foram adicionadas, 299966 linhas foram excluídas). Cerca de 45% de todas as alterações introduzidas na versão 5.15 estão relacionadas a drivers de dispositivos, aproximadamente 14% das alterações estão relacionadas à atualização de código específico para arquiteturas de hardware, 14% estão relacionadas à pilha de rede, 6% estão relacionadas a sistemas de arquivos e 3% estão relacionados aos subsistemas internos do kernel.

Principais inovações:

  • Subsistema de disco, E/S e sistemas de arquivos
    • O kernel adotou uma nova implementação do sistema de arquivos NTFS, aberta pela Paragon Software. O novo driver pode funcionar em modo de gravação e suporta todos os recursos da versão atual do NTFS 3.1, incluindo atributos de arquivo estendidos, listas de acesso (ACLs), modo de compactação de dados, trabalho eficaz com espaços vazios em arquivos (esparsos) e reprodução de alterações de o log para restaurar a integridade após falhas.
    • O sistema de arquivos Btrfs suporta o mecanismo fs-verity, que é usado para controlar de forma transparente a integridade e autenticidade de arquivos individuais usando hashes criptográficos ou chaves associadas aos arquivos, armazenados na área de metadados. Anteriormente, o fs-verity estava disponível apenas para sistemas de arquivos Ext4 e F2fs.

      O Btrfs também adiciona suporte para mapeamento de IDs de usuário para sistemas de arquivos montados (anteriormente suportado para sistemas de arquivos FAT, ext4 e XFS). Este recurso permite comparar arquivos de um usuário específico em uma partição externa montada com outro usuário no sistema atual.

      Outras mudanças no Btrfs incluem: adição mais rápida de chaves ao índice de diretório para melhorar o desempenho de criação de arquivos; a capacidade de trabalhar raid0 com um dispositivo e raid10 com dois (por exemplo, durante o processo de reconfiguração do array); opção “rescue=ibadroots” para ignorar uma árvore de extensão incorreta; aceleração da operação de “envio”; redução de conflitos de bloqueio durante operações de renomeação; a capacidade de usar setores de 4K em sistemas com tamanho de página de memória de 64K.

    • No XFS, a capacidade de usar datas posteriores a 2038 no sistema de arquivos foi estabilizada. Implementou um mecanismo para desativação atrasada de inode e suporte para instalação atrasada e remoção de atributos de arquivo. Para eliminar problemas, a capacidade de desabilitar cotas de disco para partições já montadas foi removida (você pode desabilitar cotas à força, mas o cálculo associado a elas continuará, portanto, é necessária a remontagem para desativá-las totalmente).
    • No EXT4, foi feito um trabalho para aumentar o desempenho da gravação de buffers delalloc e do processamento de arquivos órfãos que continuam a existir devido ao fato de permanecerem abertos, mas não estarem associados a um diretório. O processamento de operações de descarte foi movido para fora do thread jbd2 kthread para evitar o bloqueio de operações com metadados.
    • F2FS adicionou a opção "discard_unit=block|segment|section" para vincular operações de descarte (marcando blocos liberados que não podem mais ser armazenados fisicamente) ao alinhamento relativo a um bloco, setor, segmento ou seção. Adicionado suporte para rastrear alterações na latência de E/S.
    • O sistema de arquivos EROFS (Extendable Read-Only File System) adiciona suporte de E/S direta para arquivos salvos sem compactação, bem como suporte a fiemap.
    • OverlayFS implementa o tratamento correto dos sinalizadores de montagem "imutáveis", "somente acréscimos", "sincronização" e "noatime".
    • O NFS melhorou o tratamento de situações em que o servidor NFS para de responder às solicitações. Adicionada a capacidade de montagem a partir de um servidor que já está em uso, mas acessível através de um endereço de rede diferente.
    • Começaram os preparativos para reescrever o subsistema FSCACHE.
    • Adicionado suporte para partições EFI com posicionamento não padrão de tabelas GPT.
    • O mecanismo fanotify implementa um novo sinalizador, FAN_REPORT_PIDFD, que faz com que o pidfd seja incluído nos metadados retornados. O Pidfd ajuda a lidar com situações de reutilização de PID para identificar com mais precisão os processos que acessam os arquivos monitorados (um pidfd está associado a um processo específico e não muda, enquanto um PID pode ser associado a outro processo após o término do processo atual associado a esse PID).
    • Adicionada a capacidade de adicionar pontos de montagem a grupos compartilhados existentes à chamada do sistema move_mount(), que resolve problemas ao salvar e restaurar o estado do processo no CRIU quando há vários espaços de montagem compartilhados em contêineres isolados.
    • Adicionada proteção contra condições de corrida ocultas que poderiam causar corrupção de arquivos ao executar leituras de cache durante o processamento de vazios em um arquivo.
    • O suporte para bloqueio obrigatório (obrigatório) de arquivos, implementado por meio do bloqueio de chamadas do sistema que levam a uma alteração de arquivo, foi descontinuado. Devido a possíveis condições de corrida, esses bloqueios foram considerados não confiáveis ​​e foram descontinuados há muitos anos.
    • O subsistema LightNVM foi removido, o que permitia acesso direto ao drive SSD, contornando a camada de emulação. LightNVM perdeu seu significado após o advento dos padrões NVMe que fornecem zoneamento (ZNS, Zoned Namespace).
  • Serviços de memória e sistema
    • Foi implementado o subsistema DAMON (Data Access MONitor), que permite monitorar a atividade relacionada ao acesso a dados na RAM em relação a um processo selecionado em execução no espaço do usuário. O subsistema permite analisar quais áreas de memória o processo acessou durante toda a sua operação e quais áreas de memória permaneceram não reclamadas. DAMON apresenta baixa carga de CPU, baixo consumo de memória, alta precisão e sobrecarga constante previsível, independente do tamanho. O subsistema pode ser usado tanto pelo kernel para otimizar o gerenciamento de memória quanto por utilitários no espaço do usuário para entender exatamente o que um processo está fazendo e otimizar o uso da memória, por exemplo, liberando o excesso de memória para o sistema.
    • A chamada de sistema process_mrelease foi implementada para agilizar o processo de liberação de memória de um processo que completa sua execução. Em circunstâncias normais, a liberação de recursos e o encerramento do processo não são instantâneos e podem ser atrasados ​​por vários motivos, interferindo nos sistemas de resposta antecipada da memória do espaço do usuário, como oomd (fornecido pelo systemd) e lmkd (usado pelo Android). Ao chamar process_mrelease, tais sistemas podem acionar de forma mais previsível a recuperação de memória de processos forçados.
    • Do ramo do kernel PREEMPT_RT, que desenvolve suporte para operação em tempo real, foram transferidas variantes de primitivas para organização de bloqueios mutex, ww_mutex, rw_semaphore, spinlock e rwlock, baseadas no subsistema RT-Mutex. Foram adicionadas alterações ao alocador de placas SLUB para melhorar a operação no modo PREEMPT_RT e reduzir o impacto nas interrupções.
    • O suporte para o atributo do agendador de tarefas SCHED_IDLE foi adicionado ao cgroup, permitindo que você forneça este atributo a todos os processos de um grupo incluído em um cgroup específico. Aqueles. esses processos só serão executados quando não houver outras tarefas aguardando para serem executadas no sistema. Ao contrário de definir o atributo SCHED_IDLE para cada processo individualmente, ao vincular SCHED_IDLE a um cgroup, o peso relativo das tarefas dentro do grupo é levado em consideração ao selecionar uma tarefa a ser executada.
    • O mecanismo para contabilizar o consumo de memória no cgroup foi expandido com a capacidade de rastrear estruturas de dados adicionais do kernel, incluindo aquelas criadas para polling, processamento de sinais e namespaces.
    • Adicionado suporte para agendamento assimétrico de vinculação de tarefas a núcleos de processador em arquiteturas nas quais algumas CPUs permitem a execução de tarefas de 32 bits e algumas operam apenas no modo de 64 bits (por exemplo, ARM). O novo modo permite considerar apenas CPUs que suportam tarefas de 32 bits ao agendar tarefas de 32 bits.
    • A interface de E/S assíncrona io_uring agora suporta a abertura de arquivos diretamente na tabela de índice de arquivos fixos, sem usar um descritor de arquivo, o que permite acelerar significativamente alguns tipos de operações, mas vai contra o processo tradicional do Unix de usar descritores de arquivo para abrir arquivos.

      io_uring para o subsistema BIO (Block I/O Layer) implementa um novo mecanismo de reciclagem (“reciclagem BIO”), que reduz a sobrecarga no processo de gerenciamento de memória interna e aumenta o número de operações de E/S processadas por segundo em aproximadamente 10% . io_uring também adiciona suporte para chamadas de sistema mkdirat(), symlinkat() e linkat().

    • Para programas BPF, foi implementada a capacidade de solicitar e processar eventos de timer. Um iterador para soquetes UNIX foi adicionado e a capacidade de obter e definir opções de soquete para setsockopt foi implementada. O dumper BTF agora suporta dados digitados.
    • Em sistemas NUMA com diferentes tipos de memória que diferem em desempenho, quando o espaço livre se esgota, as páginas de memória despejadas são transferidas da memória dinâmica (DRAM) para uma memória permanente mais lenta (memória persistente) em vez de excluir essas páginas. Os testes mostraram que tais táticas geralmente melhoram o desempenho em tais sistemas. NUMA também oferece a capacidade de alocar páginas de memória para um processo a partir de um conjunto selecionado de nós NUMA.
    • Para a arquitetura ARC, foi implementado suporte para tabelas de páginas de memória de três e quatro níveis, o que permitirá ainda mais suporte para processadores ARC de 64 bits.
    • Para a arquitetura s390, foi implementada a capacidade de usar o mecanismo KFENCE para detectar erros ao trabalhar com memória e foi adicionado suporte para o detector de condição de corrida KCSAN.
    • Adicionado suporte para indexação da lista de mensagens geradas via printk(), permitindo recuperar todas essas mensagens de uma vez e rastrear alterações no espaço do usuário.
    • mmap() removeu o suporte para a opção VM_DENYWRITE, e o código do kernel foi removido do modo MAP_DENYWRITE, o que reduziu o número de situações que levam ao bloqueio de gravações em um arquivo com o erro ETXTBSY.
    • Um novo tipo de verificação, “Investigações de eventos”, foi adicionado ao subsistema de rastreamento, que pode ser anexado a eventos de rastreamento existentes, definindo seu próprio formato de saída.
    • Ao construir o kernel usando o compilador Clang, o assembler padrão do projeto LLVM agora é usado.
    • Como parte de um projeto para livrar o kernel do código que leva à saída de avisos do compilador, foi realizado um experimento com o modo “-Werror” habilitado por padrão, no qual os avisos do compilador são processados ​​como erros. Em preparação para a versão 5.15, Linus começou a aceitar apenas alterações que não resultassem em avisos ao construir o kernel e habilitou a construção com "-Werror", mas depois concordou que tal decisão era prematura e atrasou a habilitação de "-Werror" por padrão . A inclusão do sinalizador “-Werror” durante a montagem é controlada usando o parâmetro WERROR, que é definido como COMPILE_TEST por padrão, ou seja, Por enquanto, ele está habilitado apenas para compilações de teste.
  • Virtualização e Segurança
    • Um novo manipulador dm-ima foi adicionado ao Device Mapper (DM) com a implementação de um mecanismo de certificação remota baseado no subsistema IMA (Integrity Measurement Architecture), que permite que um serviço externo verifique o estado dos subsistemas do kernel para garantir sua autenticidade . Na prática, o dm-ima permite criar armazenamentos usando o Device Mapper que estão vinculados a sistemas de nuvem externos, nos quais a validade da configuração do alvo DM iniciada é verificada usando o IMA.
    • prctl() implementa uma nova opção PR_SPEC_L1D_FLUSH, que quando habilitada, faz com que o kernel libere o conteúdo do cache de primeiro nível (L1D) cada vez que ocorre uma troca de contexto. Este modo permite, seletivamente para os processos mais importantes, implementar proteção adicional contra a utilização de ataques de canal lateral realizados para determinar dados que se instalaram no cache em decorrência de vulnerabilidades causadas pela execução especulativa de instruções na CPU. O custo de habilitar PR_SPEC_L1D_FLUSH (não habilitado por padrão) é uma penalidade significativa no desempenho.
    • É possível construir o kernel com a adição do sinalizador “-fzero-call-used-regs=used-gpr” ao GCC, que garante que todos os registros sejam zerados antes de retornar o controle da função. Esta opção permite proteger contra vazamento de informações de funções e reduzir em 20% o número de blocos adequados para construir gadgets ROP (Programação Orientada a Retorno) em exploits.
    • Foi implementada a capacidade de construir kernels para a arquitetura ARM64 na forma de clientes para o hipervisor Hyper-V.
    • É proposto um novo framework de desenvolvimento de driver “VDUSE”, que permite implementar dispositivos de blocos virtuais no espaço do usuário e utilizar o Virtio como transporte para acesso a partir de sistemas convidados.
    • Adicionado driver Virtio para o barramento I2C, tornando possível emular controladores I2C em modo de paravirtualização usando backends separados.
    • Adicionado driver Virtio gpio-virtio para permitir que convidados acessem linhas GPIO fornecidas pelo sistema host.
    • Adicionada a capacidade de restringir o acesso a páginas de memória para drivers de dispositivo com suporte DMA em sistemas sem uma MMU (unidade de gerenciamento de memória) de E/S.
    • O hipervisor KVM tem a capacidade de exibir estatísticas na forma de histogramas lineares e logarítmicos.
  • subsistema de rede
    • O módulo ksmbd foi adicionado ao kernel com a implementação de um servidor de arquivos usando o protocolo SMB3. O módulo complementa a implementação do cliente SMB anteriormente disponível no kernel e, diferentemente do servidor SMB executado no espaço do usuário, é mais eficiente em termos de desempenho, consumo de memória e integração com recursos avançados do kernel. Ksmbd é apresentado como uma extensão Samba de alto desempenho e pronta para integração que se integra às ferramentas e bibliotecas Samba conforme necessário. Os recursos do ksmbd incluem suporte aprimorado para tecnologia de cache de arquivos distribuídos (locações SMB) em sistemas locais, o que pode reduzir significativamente o tráfego. No futuro, eles planejam adicionar suporte para RDMA (“smbdirect”) e extensões de protocolo relacionadas ao aumento da confiabilidade da criptografia e verificação usando assinaturas digitais.
    • O cliente CIFS não oferece mais suporte a NTLM e aos algoritmos de autenticação baseados em DES mais fracos usados ​​no protocolo SMB1.
    • O suporte multicast é implementado na implementação de pontes de rede para vlans.
    • O driver de ligação, usado para agregar interfaces de rede, adicionou suporte para o subsistema XDP (eXpress Data Path), que permite manipular pacotes de rede antes de serem processados ​​​​pela pilha de rede do kernel Linux.
    • A pilha sem fio mac80211 suporta STA (Autorização Temporária Especial) de 6 GHz nos modos LPI, SP e VLP, bem como a capacidade de definir TWT (Target Wake Time) individual no modo de ponto de acesso.
    • Adicionado suporte para MCTP (Management Component Transport Protocol), usado para interação entre controladores de gerenciamento e dispositivos associados (processadores host, dispositivos periféricos, etc.).
    • Integração no núcleo do MPTCP (MultiPath TCP), uma extensão do protocolo TCP para organizar o funcionamento de uma conexão TCP com a entrega de pacotes simultaneamente ao longo de diversas rotas através de diferentes interfaces de rede associadas a diferentes endereços IP. A nova versão adiciona suporte para endereços no modo fullmesh.
    • Manipuladores para fluxos de rede encapsulados no protocolo SRv6 (Segment Routing IPv6) foram adicionados ao netfilter.
    • Adicionado suporte de sockmap para soquetes de streaming Unix.
  • Оборудование
    • O driver amdgpu suporta APUs Cyan Skillfish (equipadas com GPUs Navi 1x). O APU Yellow Carp agora suporta codecs de vídeo. Suporte aprimorado à GPU Aldebaran. Adicionados novos identificadores de mapa baseados em GPU Navi 24 “Beige Goby” e RDNA2. É proposta uma implementação aprimorada de telas virtuais (VKMS). Foi implementado suporte para monitoramento de temperatura dos chips AMD Zen 3.
    • O driver amdkfd (para GPUs discretas, como Polaris) implementa um gerenciador de memória virtual compartilhada (SVM, memória virtual compartilhada) baseado no subsistema HMM (gerenciamento de memória heterogênea), que permite a utilização de dispositivos com unidades de gerenciamento de memória próprias (MMU , unidade de gerenciamento de memória), que pode acessar a memória principal. Em particular, usando HMM, você pode organizar um espaço de endereço compartilhado entre a GPU e a CPU, no qual a GPU pode acessar a memória principal do processo.
    • O driver i915 para placas de vídeo Intel amplia o uso do gerenciador de memória de vídeo TTM e inclui a capacidade de gerenciar o consumo de energia baseado em GuC (Graphics micro Controller). Começaram os preparativos para a implementação do suporte para a placa gráfica Intel ARC Alchemist e GPU Intel Xe-HP.
    • O driver nouveau implementa controle de luz de fundo para painéis eDP usando DPCD (DisplayPort Configuration Data).
    • Adicionado suporte para GPUs Adreno 7c Gen 3 e Adreno 680 ao driver msm.
    • O driver IOMMU é implementado para o chip Apple M1.
    • Adicionado driver de som para sistemas baseados em APUs AMD Van Gogh.
    • O driver Realtek R8188EU foi adicionado ao ramo de teste, que substituiu a versão antiga do driver (rtl8188eu) para os chips sem fio Realtek RTL8188EU 802.11 b/g/n.
    • O driver ocp_pt está incluído para a placa PCIe desenvolvida pela Meta (Facebook) com a implementação de um relógio atômico em miniatura e um receptor GNSS, que pode ser usado para organizar a operação de servidores separados de sincronização de hora exata.
    • Adicionado suporte para smartphones Sony Xperia 10II (Snapdragon 665), Xiaomi Redmi 2 (Snapdragon MSM8916), Samsung Galaxy S3 (Snapdragon MSM8226), Samsung Gavini/Codina/Kyle.
    • Adicionado suporte para ARM SoС e NVIDIA Jetson TX2 NX Developer Kit, Sancloud BBE Lite, PicoITX, DRC02, SolidRun SolidSense, SKOV i.MX6, Nitrogen8, Traverse Ten64, GW7902, Microchip SAMA7, ualcomm Snapdragon SDM636/SM8150, Renesas R-Car H3e placas -2G/M3e-2G, Marvell CN913x, ASpeed ​​​​AST2600 (placas de servidor Facebook Cloudripper, Elbert e Fuji), 4KOpen STiH418-b2264.
    • Adicionado suporte para painéis LCD Gopher 2b, EDT ETM0350G0DH6/ETMV570G2DHU, LOGIC Technologies LTTD800480070-L6WH-RT, Multi-Innotechnology MI1010AIT-1CP1, Innolux EJ030NA 3.0, ilitek ili9341, E Ink VB3300-KCA, Samsung ATNA33XC20 7430, Samsung DB2401, WideChips WSXNUMX .
    • Adicionado driver LiteETH com suporte para controladores Ethernet usados ​​em SoCs de software LiteX (para FPGAs).
    • Uma opção de baixa latência foi adicionada ao driver usb-audio para controlar a inclusão da operação no modo de latência mínima. Também foi adicionada a opção quirk_flags para passar configurações específicas do dispositivo.

Ao mesmo tempo, a Fundação Latino-Americana de Software Livre formou uma versão do kernel 5.15 totalmente gratuito - Linux-libre 5.15-gnu, livre de elementos de firmware e drivers contendo componentes ou seções de código não livres, cujo escopo é limitado pelo fabricante. A nova versão implementa a saída de uma mensagem para o log sobre a conclusão da limpeza. Problemas com a geração de pacotes usando mkspec foram corrigidos, o suporte para pacotes snap foi melhorado. Removidos alguns avisos exibidos ao processar o arquivo de cabeçalho firmware.h. Permitiu a saída de alguns tipos de avisos (“format-extra-args”, comentários, funções e variáveis ​​não utilizadas) ao construir no modo “-Werror”. Adicionada limpeza de driver gehc-achc. Código de limpeza de blob atualizado em drivers e subsistemas adreno, btusb, btintel, brcmfmac, aarch64 qcom. A limpeza dos drivers prism54 (removido) e rtl8188eu (substituído por r8188eu) foi interrompida.

Fonte: opennet.ru

Adicionar um comentário