- 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
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?