10 puntos por xguru 2022-07-25 | 1 comentarios | Compartir por WhatsApp
  • La investigación comenzó por una descompresión extremadamente lenta al extraer un tar.gz de 518GiB
  • Explica el formato Tar y lo va ilustrando mientras escribe código para un extractor de tar rápido

Formato original de archivos Tar

  • Tar es muy inusual como archivo de archivo
    → No tiene encabezado de archivo, no tiene índice de archivos para búsqueda, no tiene magic bytes para verificar que es tar, no tiene footer ni metadatos
    → Lo único que hay dentro de tar es un solo tipo de objeto: archivos
  • Tipos de archivo: 0 (archivo regular), 1 (enlace duro), 2 (enlace simbólico)
  • Explicación de la estructura del encabezado de objeto de archivo de 512 bytes
    → La mayor limitación es que la ruta del archivo solo puede tener 100 caracteres. Además, el tamaño máximo del archivo es 8GiB

Archivos extendidos UStar

  • La longitud máxima de la ruta del archivo es 256 y se agregan nuevos tipos de archivo
  • Se extiende el encabezado para agregar magic bytes y el campo prefix
  • Tipos de archivo agregados: 3 (dispositivo de caracteres), 4 (dispositivo de bloques), 5 (directorio), 6 (archivo FIFO), 7 (archivo continuo)
  • Pero el límite de 8GiB sigue igual

Formato de archivo Pax

  • El estándar POSIX.1-2001 extendió el formato tar a través del CLI pax
  • Es igual que UStar, pero agrega los formatos de archivo x y g
    → Como registros de encabezado extendido, x se aplica solo al siguiente archivo y g se aplica a todos los archivos posteriores

Formato de archivo GNU Tar

  • Su formato propio es gnu, distinto de pax
  • Al igual que pax, está basado en UStar, pero usa un método diferente para codificar rutas y archivos grandes
    → Tipo L: el payload del siguiente objeto de archivo representa file_path
    → Tipo K: el payload del siguiente objeto de archivo representa link_path
    → Ambos pueden aplicarse de forma consecutiva
    → Si el archivo es mayor que 8GiB, se activa el bit más alto del primer carácter de file_size. Entonces el resto de la cadena se interpreta en base 256 (entero de 95 bits)

¿Por qué GNU tar descomprime tan lento?

  • Si en el encabezado del archivo se pone un valor como file_path="../hello.txt", se produce un problema de seguridad. Pero no es fácil bloquearlo
  • Cuando GNU tar encuentra ".." en link_path, crea un placeholder y pospone su procesamiento
  • Pero en el caso de enlaces duros sin "..", quiere crearlos directamente, aunque no puede porque ya existe el placeholder
  • Es decir, para crear un enlace duro primero hay que verificar por completo si es un enlace diferido, y si lo es, el nuevo enlace también debe procesarse de forma diferida
    → Tiene que buscar enlaces diferidos para todos los enlaces duros. No se sabe por qué, pero en la práctica hace la búsqueda dos veces
  • En el archivo Tar del autor había más de 800 mil enlaces con ".." y más de 5.4 millones de enlaces duros, por eso la extracción se volvió lenta
  • Para evitarlo, hay que agregar a tar la opción --absolute-paths o -P
    → Es una opción que guarda rutas absolutas y rechaza ".."
    → Es decir, al usar -P se desactiva el mecanismo de enlaces diferidos