Por qué GNU tar es tan lento al extraer
(mort.coffee)- La investigación comenzó por una descompresión extremadamente lenta al extraer un
tar.gzde 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
xyg
→ Como registros de encabezado extendido,xse aplica solo al siguiente archivo ygse 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
→ TipoL: el payload del siguiente objeto de archivo representafile_path
→ TipoK: el payload del siguiente objeto de archivo representalink_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 defile_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
".."enlink_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-pathso-P
→ Es una opción que guarda rutas absolutas y rechaza".."
→ Es decir, al usar-Pse desactiva el mecanismo de enlaces diferidos
1 comentarios
Los artículos sobre tar siempre parecen interesantes..
hop - un formato de archivo 10 veces más rápido que tar
¿Por qué un archivo tar.xz hecho con Python es más pequeño que uno hecho con tar por defecto?