Re: Extend initramfs archive format to support xattrs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 12/14/2015 07:17 AM, Mimi Zohar wrote:
> Hi James,
> 
> I think we need to describe the basic problem being discussed, make a
> list of the problems and then decide which could and should be addressed
> before upstreaming the initramfs xattr support.

I still have this on my todo list for toybox and would very much like to
be involved.

Any archive format change should add xattrs, fix the 32 bit time with no
nanoseconds problem too, and probably the 32 bit file size limit while
we're there.

Beyond that, cpio was chosen because it's simple. Let's not complicate
it unnecessarily?

> The patches posted about a year ago to extend the initramfs archive
> format to support xattrs changed the initramfs magic number from 070701
> to 070703.  James pointed out, in an offline email, a number of problems
> that should be addressed, before making this magic number change.

Here's my suggestion:

For the new type just change all the fields from 32 bits to 64 bits
(I.E. from 8 to 16 hex digits), and tack on xattrcount. With data
compression the difference more or less vanishes, and the header size
still fits in 256 bytes.

This keeps the parsing simple (all fields after the first are the same
size!) while solving not only filesize and timestamp (interpreted now as
seconds=mtime>>20; nanosecs=mtime&((1<<20)-1); which gives us half a
million years and change), but this also addresses the 32 bit inode and
nlink limits (in case anyone cares).

If xattrcount is nonzero, then at the end of this entry's datastream
have a 16 digit size, followed by that much data, repeated xattrcount
times. Each one is a key=value and the point of size is we don't care
what the value is (embedded NUL? No problem!).

If somebody wants a "data fork" instead of an xattr, pick a magic key
name for it. Not our problem. Smack vs Selinux: not our problem.

> James' original list:
> 1) Bad CRC it just added bytes together not even a real crc much less
> something that would cause confidence like md5 or shaX, or better a
> digital signature. of course we are not even using that CRC yet.

The enclosing compression checksums the data, no need to repeat it. As
you say, we're not currently using the cpio checksum. We're using the
gzip (or lzma...) checksum.

Heck, using the checksum field _as_ the xattrcount field in the new
format would work for me, but I don't feel strongly about the issue. If
you instead want to take 64 bits of data and use... I dunno, sha1sum
with the high and low halves xored, up to you.

> 2) It is still missing the other two timestamps all three of which
> should likely be extended beyond 64bits if you want sub-second accuracy

Why? Initramfs doesn't particularly need to distinguish creation,
modification, and access time.

We should extend beyond 32 bits for y2038 reasons. (Yeah unsigned gives
us almost another century but as long as we're changing the format
anyway...) A 64 bit format with 44 bits of time and 20 bits of
nanoseconds seems straightforward enough and gets us half a million years.

Again, not strongly opposed, just don't see a use case for it. Tar
exists if you want fancy.

> 3) The missing user and group names

We have existing uid and gid names. Are you suggesting that the kernel's
initramfs parser should reach into userspace, read the /etc/passwd file
that initramfs supplied, and confirm that those uid and gid names _match_?

I'm not following this suggestion at all. The kernel adding magic
uid/gid values for devtmpfs was deeply questionable, but at least it was
still numbers not names.

> 4) Lack of padding/blocking control; having the file data uncompress on
> a page boundary would be very convenient for the tmpfs

I don't see how that's cpio's problem? The data currently gets copied
into the page cache to align it: life is good.

The alternative you're suggesting seems to be putting each file's cpio
header and a lot of padding on its own page, which means you eat one
page per file during decompression, which can get big fast _and_ means
you've made confetti of physical memory in early boot when you discard
them all.

If you want to make the cpio extractor cleverer you can have it
decompress 64k at a time and handle the decompression in cache-friendly
chunks. Filling up and processing an output buffer is a thing they have
to be able to do. The processing is usually just write() in userspace
but it's a hook we can use. Then process just the data in that buffer
before extracting the rest (special case if you end halfway through a
cpio header copy it to the start of the buffer and do a decompress of
64k-remainder, but that's not a big deal).

The advantage of that is your extracted cpio copy should fit into L2
cache even on low-end chips, and be able to flush a page at a time to
DRAM in nice friendly sequential bursts to the same bank. (Heck, 32k
should be plenty and that's cache local for almost everything, modulo
the compressor's internal data probably not being so for anything but
gzip...)

This does not require any change to the file format.

> 5) Handling sparse files

Detect whole-page runs of zeroes during decompression. Gzip the file and
they basically go away. This does not require a format change, and
adding one is unnecessary complexity.

> 6) Alternate streams, for example Mac OS and NTFS

We're proposing adding xattr support. They contain arbitrary data and
are of arbitrary length. Pick a magic xattr name for your stream, not
our problem.

The above "xattr length, xattr contents" means you can have any in-band
data you want, we don't mess with the contents other than expecting a
"name=" header identifying each one.

> 7) The longer device major and minor numbers.

Currently devmajor is 32 bits and devminor is 32 bits. You need longer
than that?

Ok, this proposal would extended them to 64 bits anyway (treat all the
fields the same and simplify the parsing as an array), but I don't
understand the objection...

> Do we need to address all of these issues?

No?

> Are there any other changes,
> which should be made before changing the magic number?

My cpio.txt isn't on this machine, but not off the top of my head? File
size, file date, and xattr are the big ones.

> Mimi

Rob
--
To unsubscribe from this list: send the line "unsubscribe initramfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Kernel]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]

  Powered by Linux