[Buildroot] [git commit] fs: don't use an intermediate tarball

Peter Korsgaard peter at korsgaard.com
Sun Nov 25 22:30:50 UTC 2018

>>>>> "Arnout" == Arnout Vandecappelle (Essensium/Mind) <arnout at mind.be> writes:

 > commit: https://git.buildroot.net/buildroot/commit/?id=409d4c3fe9949f01b009712a1a731baf597e0f8d
 > branch: https://git.buildroot.net/buildroot/commit/?id=refs/heads/master

 > Since 118534fe54b (fs: use a common tarball as base for the other
 > filesystems), the filesystem creation is split in two steps, using an
 > intermediate tarball to carry the generic, common finalisations to the
 > per-filesystem finalisation and image creation.

 > However, this intermediate tarball causes an issue with capabilities:
 > they are entirely missing in the generated filesystems.

 > Capabilities are stored in the extended attribute security.capability,
 > which tar by default will not store/restore, unless explicitly told to,
 > e.g. with --xattrs-include='*', which we don't pass.

 > Now, passing this option when creating and extracting the intermediate
 > tarball, both done under fakeroot, will cause fakeroot to report an
 > invalid filetype for files with capabilities. mksquashfs would report
 > such unknown files as a warning, while mkfs.ext2 would fail (with a
 > similar error message), e.g.:

 >     File [...]/usr/sbin/getcap has unrecognised filetype 0, ignoring

 > This is due to a poor interaction between tar and fakeroot; running as
 > root the exact same commands we run under fakeroot, works as expected.
 > Unfortunately, short of fixing fakeroot (which would first require
 > understanding the problem in there), we don't have much options.

 > The intermediate tarball was made to avoid redoing the same actions over
 > and over again for each filesystem to build. However, most of the time,
 > only one or two such filesystems would be enabled [0], and those actions
 > are usually pretty lightweight. So, using an intermediate tarball does
 > not provide a big optimisation.

 > The main reason to introduce the intermediate tarball, however, is that
 > it allows to postpone per-filesystem finalisations to be applied only
 > for the corresponding filesystem, not for all of them.

 > So, we get rid of the intermediate tarball, and simply move all of the
 > code to run under fakeroot to the per-filesystem fakeroot script.
 > Instead of extracting the intermediate tarball, we just rsync the
 > original target/ directory, and apply the filesystem finalisations on
 > that copy. The only thing still done in the rootfs-common step is to
 > generate the intermediate files (users file, devices file) that are used
 > in the fakeroot script.

 > Fixes: https://bugs.busybox.net/show_bug.cgi?id=11216

 > Note: an alternate solution would have been to keep the intermediate
 > tarball to keep most of the common finalisations, and move only the
 > permissions to each filesystem, but that was getting a bit more complex
 > and changed the ordering of permissions and post-fakeroot scripts. Once
 > we bite the bullet of having some common finalisation done in each
 > filesystem, it's easier to just move all of them.

 > [0] Most probsably, users would enable the real filesystem to put on
 > their device, plus the 'tar' filesystem, to be able to easily inspect
 > the content on their development machine.

 > Reported-by: Ricardo Martincoski <ricardo.martincoski at gmail.com>
 > Signed-off-by: "Yann E. MORIN" <yann.morin.1998 at free.fr>
 > Cc: Ricardo Martincoski <ricardo.martincoski at gmail.com>
 > Cc: Thomas Petazzoni <thomas.petazzoni at bootlin.com>
 > Cc: Arnout Vandecappelle <arnout at mind.be>
 > Cc: Peter Korsgaard <peter at korsgaard.com>
 > Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout at mind.be>

Committed to 2018.08.x, thanks.

Bye, Peter Korsgaard

More information about the buildroot mailing list