stringtranslate.com

io_uring

io_uring (anteriormente conocido como aioring ) es una interfaz de llamada al sistema del kernel de Linux para operaciones de E/S asincrónicas de dispositivos de almacenamiento que aborda problemas de rendimiento con interfaces similares proporcionadas por funciones como / o / etc. para operaciones en datos a los que se accede mediante descriptores de archivos . [1] [2] : 2 read()write()aio_read()aio_write()

El desarrollo está en curso y Jens Axboe de Meta trabaja en él principalmente . [1]

Interfaz

Funciona creando dos buffers circulares , llamados "anillos de cola", para el almacenamiento de las solicitudes de E/S de envío y finalización, respectivamente. Para los dispositivos de almacenamiento, se denominan cola de envío (SQ) y cola de finalización (CQ). [3] Mantener estos buffers compartidos entre el núcleo y la aplicación ayuda a aumentar el rendimiento de E/S al eliminar la necesidad de emitir llamadas al sistema adicionales y costosas para copiar estos buffers entre los dos. [1] [3] [4] Según el documento de diseño de io_uring, el buffer SQ solo puede ser escrito por aplicaciones de consumo, y el buffer CQ solo puede ser escrito por el núcleo. [1] : 3 

eBPF se puede combinar con io_uring. [5]

Historia

El núcleo Linux ha admitido la E/S asincrónica desde la versión 2.5, pero se consideraba difícil de usar e ineficiente. [6] Esta API más antigua solo admitía ciertos casos de uso específicos , [7] en particular, solo permite la operación asincrónica cuando se usa el indicador O_DIRECT y al acceder a archivos ya asignados. Esto evita utilizar la caché de páginas , al mismo tiempo que expone la aplicación a la semántica compleja de O_DIRECT. Linux AIO tampoco admite sockets, por lo que no se puede usar para multiplexar la E/S de red y disco. [8]

La interfaz del kernel io_uring se adoptó en la versión 5.1 del kernel de Linux para resolver las deficiencias de Linux AIO. [1] [4] [9] La biblioteca liburing proporciona una API para interactuar con la interfaz del kernel fácilmente desde el espacio de usuario . [1] : 12 

Seguridad

Se ha observado que io_uring expone una superficie de ataque significativa y dificultades estructurales al integrarlo con el subsistema de seguridad de Linux . [10]

En junio de 2023, el equipo de seguridad de Google informó que el 60 % de los exploits enviados a su programa de recompensas por errores en 2022 eran exploits de las vulnerabilidades io_uring del kernel de Linux. Como resultado, io_uringse deshabilitó para las aplicaciones en Android y se deshabilitó por completo en ChromeOS , así como en los servidores de Google. [11] En consecuencia, Docker también deshabilitó io_uring de su perfil seccomp predeterminado. [12]

Referencias

  1. ^ abcdef "El kernel de Linux obtiene io_uring para ofrecer E/S rápidas y eficientes". Phoronix . 2019-02-14 . Consultado el 2021-03-14 .
  2. ^ Axboe, Jens (15 de octubre de 2019). "IO eficiente con io_uring" (PDF) .
  3. ^ ab "Practicar io_uring con Go". developer.mattermost.com . Consultado el 20 de noviembre de 2021 .
  4. ^ ab "El rápido crecimiento de io_uring [LWN.net]". lwn.net . Consultado el 20 de noviembre de 2021 .
  5. ^ "BPF se encuentra con io_uring [LWN.net]". LWN.net . Consultado el 17 de abril de 2023 .
  6. ^ Corbet, Jonathan. "Lanzamiento de una nueva API de E/S asincrónica". LWN.net . Consultado el 14 de marzo de 2021 .
  7. ^ "Novedades de io_uring" (PDF) . Consultado el 1 de junio de 2022 .
  8. ^ "E/S asincrónica de Linux". 2014-04-21. Archivado desde el original el 2015-04-06 . Consultado el 2023-06-16 . Bloqueo durante io_submit en ext4, en operaciones almacenadas en búfer, acceso a la red, tuberías, etc. Algunas operaciones no están bien representadas por la interfaz AIO. Con operaciones completamente no compatibles como lecturas almacenadas en búfer, operaciones en un socket o tuberías, la operación completa se realizará durante la llamada al sistema io_submit, con la finalización disponible inmediatamente para acceso con io_getevents. El acceso AIO a un archivo en un sistema de archivos como ext4 es parcialmente compatible: si se requiere una lectura de metadatos para buscar el bloque de datos (es decir, si los metadatos aún no están en la memoria), entonces la llamada io_submit bloqueará la lectura de metadatos. Ciertos tipos de escrituras que amplían archivos no son compatibles en absoluto y se bloquean durante toda la duración de la operación.
  9. ^ "IO más rápido mediante io_uring". Recetas de kernel 2019. Consultado el 14 de marzo de 2021 .
  10. ^ Corbet, Jonathan (28 de julio de 2022). "Requisitos de seguridad para las nuevas características del núcleo". LWN.net . Consultado el 16 de junio de 2023 .
  11. ^ Koczka, Tamás. "Aprendizaje de los 42 exploits del kernel de Linux enviados por kCTF VRP". Blog de seguridad en línea de Google . Google. Archivado desde el original el 22 de septiembre de 2024. Consultado el 14 de junio de 2023. El 60 % de los envíos explotaban el componente io_uring del kernel de Linux .
  12. ^ "Actualizar el perfil seccomp de RuntimeDefault para no permitir llamadas al sistema relacionadas con io_uring por vinayakankugoyal · Solicitud de incorporación de cambios n.° 9320 · contenedord/containerd". GitHub . 2023-11-02. Archivado desde el original el 2024-01-06 . Consultado el 2024-10-20 .

Enlaces externos