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:
*– es usado para indicar “0 ó más ocurrencias de”.(|)– indica alternativas.+– indica concatenación.GZIP()– indica el operando degzip(1).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 == 1en toadas las entradas -no directorios.
Al Viro, H. Peter Anvin Last revision: 2002-01-13