=================================== 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* + ( 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 ``0``\ s 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