Formato de bufer para initramfs

Empezando por el kernel v2.5.x, el protocolo del antiguo disco ram de inicio, está siendo reemplazado/complementado por el nuevo ramfs, protocolo initramfs. El contenido de initramfs es pasado haciendo uso del mismo protocolo de memoria del bufer, usado para el protocolo initrd pero el contenido es distinto. El bufer de initramfs contiene un fichero el cuál es expandido dentro de ramfs; éste documento detalla el formato del bufer initramfs.

El formato de bufer de initramfs, está gira entorno al formato de cpio “newc” o “crc”, y podrá ser creado mediante la utilidad cpio(1). Una de las versiones válidas del bufer initramfs, es el archivo cpio.gz.

El formato completo del bufer initramfs está definido con la siguiente sintaxis:

  1. * – es usado para indicar “0 ó más ocurrencias de”.

  2. (|) – indica alternativas.

  3. + – indica concatenación.

  4. GZIP() – indica el operando de gzip(1).

  5. ALGN(n) – significa la separación con bytes nulos de un límite n-bytes.

cpio_gzip_archive := GZIP(cpio_archive)
cpio_archive := cpio_file* + (<nothing> cpio_trailer)
cpio_file := ALGN(4) + cpio_header + filename + "\0" + ALGN(4) + data
cpio_trailer := ALGN(4) + cpio_header + "TRAILER!!!\0" + ALGN(4)

En términos humanos, el bufer initramfs contiene una colección de ficheros cpio comprimidos y/o descomprimidos -en formato “newc” o “crc”; podrán ser añadidos cierta cantidad arbitraria de bytes cero, para la separación.

La sentencia de entrada cpio “cpio end-or-archive” es opcional, pero no es ignorada; ver “manipulación de enlaces duros”, más abajo.

La estructura de cpio_header es como sigue -todos los campos, contienen números hexadecimales en ASCII, separados por 0s a la izquierda en la amplitud del campo, por ejemplo, el entero 4700 es representado por la cadena 000012ac:

Nombre Campo

Tamaño Campo

Significado

c_magic

6 bytes

La cadena “070701” ó “070702”

c_ino

8 bytes

Número de inodo de archivo

c_mode

8 bytes

Modo de archivo y permisos

c_uid

8 bytes

UID del archivo

c_gid

8 bytes

GID del archivo

c_nlink

8 bytes

Número de enlaces

c_mtime

8 bytes

Tiempo de la última modificación

c_filesize

8 bytes

Tamaño del campo de datos

c_maj

8 bytes

Parte “Major” del número de dispositivo

c_min

8 bytes

Parte “Minor” del número de dispositivo

c_rmaj

8 bytes

Parte “Major” de la referencia al nodo

c_rmin

8 bytes

Parte “Minor” de la referencia al nodo

c_namesize

8 bytes

Longitud del nombre, incluyendo ‘0’ final

c_chksum

8 bytes

Suma de comprobación si c_magic es 070702, o cero

En Linux, el campo c_mode coincide con el contenido de st_mode, retornado por stat(2) y codifica el tipo de archivo y permisos.

El c_filesize debería ser cero, para cualquier archivo regular o enlace simbólico.

El campo c_chksum contiene una suma simple sin signo, de 32-bit, de todos los bytes. cpio(1) se refiere a esto, como “crc”, que es cláramente incorrecto -una comprobación de redundancia cíclica, es una mejor comprobación de integridad. Aunque es ese el algoritmo utilizado.

Si el nombre de archivo es una sentencia, es en realidad un “final-de-archivo”; el c_filesize para un “end-of-archive” deberá ser cero.

Manipulación de enlaces duros

Cuado es visto c_link > 1 -no siendo directorio, la tupla c_maj,c_min,c_ino es bloqueada otra tupla del bufer. Si no se encuentra, se inserta en la tupla del bufer y la entrada se crea de la forma habitual; si se encuentra se crea un enlace duro, en lugar de una segunda copia del contenido del archivo. Si el contenido del archivo no está incluido, el campo c_filesize, debería establecerse a cero, para indicar que sigue ninguna sección de datos. Si presenta datos, la instancia anterior del archivo es sobreescrita; esto permite el acarreo de datos, de instancia de archivo, para cualquier lugar de la secuencia. GNU cpio es informado para poder acoplar los datos, sólo a la última instancia del archivo.

c_filesize no debe ser cero para ningún enlace simbólico. Cuando es vista una sentencia “end-of-archive”, se resetea la tupla del bufer. Ésto permite a los ficheros generados independientementem, ser conectados.

Para combinar datos de archivo, desde diferentes fuentes -sin tener que regenerar los campos c_maj,c_min,c_ino, podrán ser utilizadas una de las técnicas siguiente:

  • Separar las fuentes de los archivos de datos con una sentencia “end-of-archive” ó

  • Confirmar c_link == 1 en toadas las entradas -no directorios.


Al Viro, H. Peter Anvin Last revision: 2002-01-13