<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Apr 17, 2021 at 2:56 PM Rob Landley <<a href="mailto:rob@landley.net">rob@landley.net</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On 4/16/21 1:44 PM, Yi-yo Chiang wrote:<br>
> I'm not sure what Elliot's goal is? I assume he's trying to extract a<br>
> concatenated ramdisk, and I still see a problem in the current solution. <br>
> <br>
> The buffer-format<br>
> (<a href="https://www.kernel.org/doc/Documentation/early-userspace/buffer-format.txt" rel="noreferrer" target="_blank" class="cremed">https://www.kernel.org/doc/Documentation/early-userspace/buffer-format.txt</a>) says:<br>
> <br>
>   initramfs  := ("\0" | cpio_archive | cpio_gzip_archive)*<br>
> <br>
> In other words, both `cat a.cpio b.cpio >merged.cpio` and `(cat a.cpio && echo<br>
> -n -e '\0\0\0' && cat b.cpio) >merged.cpio` are valid initramfs.<br>
<br>
It also implies that two compressed files can be concatenated and separated by<br>
arbirary runs of nulls, or you can have a compressed file and a non-compressed<br>
file concatenated, or...<br></blockquote><div><br></div><div>Correct. Upon further inspection, it's actually "arbitrary NULLs could prepend a GZIP(cpio_archive)", "arbitrary 4-aligned NULLS prepend a *uncompressed* cpio_archive" and "cpio_file/cpio_trailer within a cpio_archive have to be 4-aligned with arbitrary NULLs". initramfs.c seems to try very hard to respect the alignment requirement, but I guess we could just skip *ANY* extra NULLs for simplicity?</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
Grrr. I need to test this. And possibly genericize the tar.c code to detect<br>
compression type and run it through a decompressor so cpio can do it too...<br></blockquote><div><br></div><div>Sounds like another can of worms... :/</div><div>The buffer-format.txt seems to be a bit outdated, as Linux now supports a lot of compression types besides gzip, and all of which are configurable (<a href="https://elixir.bootlin.com/linux/latest/source/lib/decompress.c#L52">https://elixir.bootlin.com/linux/latest/source/lib/decompress.c#L52</a>). So the initramfs grammar implemented by initramfs.c is in reality:</div><div><br></div><div>  initramfs  := ("\0" | cpio_archive | compressed_cpio_archive)*</div><div>  compressed_cpio_archive := CONFIG_COMPRESSION_ALGORITHM(cpio_archive)</div><div>  CONFIG_COMPRESSION_ALGORITHM := GZIP | BZIP2 | LZMA | XZ | LZO | LZ4 | ZSTD</div><div><br></div><div>where the exact set of compression algorithms are decided by the kernel config. </div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
> btw gen_init_cpio.c also pads initramfs to 512-byte boundary<br>
> (<a href="https://github.com/torvalds/linux/blob/6fbd6cf85a3be127454a1ad58525a3adcf8612ab/usr/gen_init_cpio.c#L97" rel="noreferrer" target="_blank" class="cremed">https://github.com/torvalds/linux/blob/6fbd6cf85a3be127454a1ad58525a3adcf8612ab/usr/gen_init_cpio.c#L97</a>)<br>
<br>
*blink* *blink* Why...? (cpio doesn't have a 512 stride in the file format? It<br>
has a 4-byte stride for padding strings with NUL bytes, but that's about it?)<br>
<br>
> If we're viewing buffer-format.txt as the "right" cpio spec, then I think we<br>
> should implement this too. We should skip arbitrary extra NUL-bytes padded<br>
> between cpio file frames<br>
<br>
Skipping arbitrary extra null bytes at the start is easy enough to do. I guess<br>
the hardwired trailing read was expecting the 512 padding...<br>
<br>
I'm gonna need add a _lot_ more test suite entries for this command.<br>
<br>
Ok, skip arbitrary leading NUL bytes after each entry, pad last record to 512<br>
byte alignment with NUL bytes, autodetect compression type at each record start,<br>
implement hardlinks and have TRAILER!!! flush hardlink context...<br>
<br></blockquote><div><br></div><div>I'm not so sure about padding the last entry to 512-byte boundary. 512 looks like a random value to me? (Or an implementation detail of GNU cpio and gen_init_cpio). Nonetheless I think we should pad the last record to 4-byte boundary, so that both</div><div><br></div><div>  cat a.cpio.gz b.cpio.gz >c.cpio.gz</div><div><br></div><div>and</div><div>  </div><div>  zcat a.cpio.gz b.cpio.gz >c.cpio</div><div><br></div><div>are valid initramfs/cpio? </div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Rob<br>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><table width="90%" border="0" cellspacing="0" cellpadding="0" style="margin:0px;padding:0px;font-family:"Times New Roman";max-width:348px"><tbody style="margin:0px;padding:0px"><tr style="margin:0px;padding:0px"><td style="padding:0px"><table border="0" cellspacing="0" cellpadding="0" style="margin:0px;padding:20px 0px 0px"><tbody style="margin:0px;padding:0px"><tr style="margin:0px;padding:0px"><td valign="top" style="padding:0px 20px 0px 0px;vertical-align:top;border-right:1px solid rgb(213,213,213)"><img src="https://i.imgur.com/eGpkLls.png" width="200" height="64"><br></td><td style="padding:0px 0px 0px 20px"><table border="0" cellspacing="0" cellpadding="0" style="margin:0px;padding:0px"><tbody style="margin:0px;padding:0px"><tr style="margin:0px;padding:0px"><td colspan="2" style="font-family:Arial,Helvetica,Verdana,sans-serif;padding:1px 0px 5px;font-size:13px;line-height:13px;color:rgb(56,58,53);font-weight:700">Yi-yo Chiang</td></tr><tr style="margin:0px;padding:0px"><td colspan="2" style="font-family:Arial,Helvetica,Verdana,sans-serif;padding:0px 0px 5px;font-size:11px;line-height:13px;color:rgb(56,58,53)">Software Engineer</td></tr><tr style="margin:0px;padding:0px"><td colspan="2" style="font-family:Arial,Helvetica,Verdana,sans-serif;padding:0px 0px 5px;font-size:11px;line-height:13px;color:rgb(56,58,53)"><a href="mailto:yochiang@google.com" target="_blank">yochiang@google.com</a></td></tr><tr style="margin:0px;padding:0px"><td colspan="2" style="font-family:Arial,Helvetica,Verdana,sans-serif;padding:0px 0px 3px;font-size:11px;line-height:13px;color:rgb(3,112,248)"></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></div></div></div>