📄 buffer-format.txt
字号:
initramfs buffer format ----------------------- Al Viro, H. Peter Anvin Last revision: 2002-01-13Starting with kernel 2.5.x, the old "initial ramdisk" protocol isgetting {replaced/complemented} with the new "initial ramfs"(initramfs) protocol. The initramfs contents is passed using the samememory buffer protocol used by the initrd protocol, but the contentsis different. The initramfs buffer contains an archive which isexpanded into a ramfs filesystem; this document details the format ofthe initramfs buffer format.The initramfs buffer format is based around the "newc" or "crc" CPIOformats, and can be created with the cpio(1) utility. The cpioarchive can be compressed using gzip(1). One valid version of aninitramfs buffer is thus a single .cpio.gz file.The full format of the initramfs buffer is defined by the followinggrammar, where: * is used to indicate "0 or more occurrences of" (|) indicates alternatives + indicates concatenation GZIP() indicates the gzip(1) of the operand ALGN(n) means padding with null bytes to an n-byte boundary initramfs := ("\0" | cpio_archive | cpio_gzip_archive)* 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)In human terms, the initramfs buffer contains a collection ofcompressed and/or uncompressed cpio archives (in the "newc" or "crc"formats); arbitrary amounts zero bytes (for padding) can be addedbetween members.The cpio "TRAILER!!!" entry (cpio end-of-archive) is optional, but isnot ignored; see "handling of hard links" below.The structure of the cpio_header is as follows (all fields containhexadecimal ASCII numbers fully padded with '0' on the left to thefull width of the field, for example, the integer 4780 is representedby the ASCII string "000012ac"):Field name Field size Meaningc_magic 6 bytes The string "070701" or "070702"c_ino 8 bytes File inode numberc_mode 8 bytes File mode and permissionsc_uid 8 bytes File uidc_gid 8 bytes File gidc_nlink 8 bytes Number of linksc_mtime 8 bytes Modification timec_filesize 8 bytes Size of data fieldc_maj 8 bytes Major part of file device numberc_min 8 bytes Minor part of file device numberc_rmaj 8 bytes Major part of device node referencec_rmin 8 bytes Minor part of device node referencec_namesize 8 bytes Length of filename, including final \0c_chksum 8 bytes Checksum of data field if c_magic is 070702; otherwise zeroThe c_mode field matches the contents of st_mode returned by stat(2)on Linux, and encodes the file type and file permissions.The c_filesize should be zero for any file which is not a regular fileor symlink.The c_chksum field contains a simple 32-bit unsigned sum of all thebytes in the data field. cpio(1) refers to this as "crc", which isclearly incorrect (a cyclic redundancy check is a different andsignificantly stronger integrity check), however, this is thealgorithm used.If the filename is "TRAILER!!!" this is actually an end-of-archivemarker; the c_filesize for an end-of-archive marker must be zero.*** Handling of hard linksWhen a nondirectory with c_nlink > 1 is seen, the (c_maj,c_min,c_ino)tuple is looked up in a tuple buffer. If not found, it is entered inthe tuple buffer and the entry is created as usual; if found, a hardlink rather than a second copy of the file is created. It is notnecessary (but permitted) to include a second copy of the filecontents; if the file contents is not included, the c_filesize fieldshould be set to zero to indicate no data section follows. If data ispresent, the previous instance of the file is overwritten; this allowsthe data-carrying instance of a file to occur anywhere in the sequence(GNU cpio is reported to attach the data to the last instance of afile only.)c_filesize must not be zero for a symlink.When a "TRAILER!!!" end-of-archive marker is seen, the tuple buffer isreset. This permits archives which are generated independently to beconcatenated.To combine file data from different sources (without having toregenerate the (c_maj,c_min,c_ino) fields), therefore, either one ofthe following techniques can be used:a) Separate the different file data sources with a "TRAILER!!!" end-of-archive marker, orb) Make sure c_nlink == 1 for all nondirectory entries.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -