[Reproducible-builds] Notes on OpenWRT Reproducibility
bnewbold at robocracy.org
bnewbold at robocracy.org
Thu Oct 15 08:53:42 UTC 2015
Hi there! This is a long rambling email, sorry.
I ran across the OpenWRT reproducible build page[0] and diffoscope outputs
this morning and thought they were super rad. I spent a bit of time to see
if I could push things forward. Presumably this will mostly involve
interaction with the OpenWRT developers, but I wanted to check in here
first for feedback and to share what I learned.
1. There's a statement that diffoscope "cannot detect .bin files as
squashfs". I don't think that's accurate, I could rename .squashfs files
to .bin and diffoscope found the magic and worked fine. I think the issue
is the huge number of hardware-specific ".bin" and ".img" formats OpenWRT
generates[1]. Many of these are in uImage format (detectable by magic),
others are just {kernel, bootloader, fs} at fixed offsets. For the former
it would be great if diffoscope could pick up on the format in any way. I
found a random script[2] that tries to extract uImage binaries into the
original files, but it would be a good start to just present the metadata
and offsets.
2. A few small changes to reproducible_openwrt.sh would be helpful. I
would enable .tar.gz rootfs output for all targets
(CONFIG_TARGET_ROOTFS_TARGZ=y) and grab some extra "image" files. In
addition to .bin and .squashfs, {*.img, *.ext4, *.rootfs.tar.gz, *.img.gz,
*.ubi, *.ubifs, *.itb} are full image suffixes. {*-uImage, *-zImage,
*-vmlinuz, *.dtb, *.elf} are suffixes of kernel files which are sometimes
distributed separately.
Also, perhaps add CONFIG_CLEAN_IPKG=y (see below).
Also, perhaps an ARM build target; A20-OLinuXino-Lime? Something with
device tree, otherwise doesn't really matter.
I can submit a patch for the above if that would help, but I wouldn't have
an easy way to test it.
In particular, being able to compare the rootfs images and kernel
images separately might be sufficient instead of trying to untangle all
the many random combined binary image formats.
3. I was sort of surprised to see linux-latest passing reproducibility in
Debian on armhf. Was anything special necessary for this, eg changes to
mkimage to generate uImage without a timestamp? Any advice or HOWTO out
there on reproducible kernel builds? I see Ben Hutchings's kbuild patch
for SOURCE_DATE_EPOCH support; is that sufficient?
4. busybox uses kconfig (or something very similar), which generates a
AUTOCONF_TIMESTAMP macro in a header file (passed through as a "banner"
variable capturing build time). I assumed this had to do with autotools at
first, but it seems to be an old kconfig thing. I don't know how many
other projects use these tools, but it might be worth making an
identifier. I worked around the problem by checking for SOURCE_DATE_EPOCH
in the Makefile and overriding the macro, but it might be cleaner to check
in kconfig itself and generate an appropriate macro variable instead, as a
reusable pattern.
5. diffoscope has squashfs support, but is there actually a way to
generate squashfs files reproducibly? Perhaps there is a way to strip the
metadata after the fact?
6. The opkg package manger leaves a log of .ipkg installs which end up on
the disk and include a (UNIX) Installed-Time field. This situation is very
similar to /var/cache with Debian. The CONFIG_CLEAN_IPKG=y flag is
sufficient to just delete this log file, or opkg could add an argument to
override the time, or a sed script could "fix" all the timestamps. A
question for the OpenWRT developers.
I haven't gotten to any complete reproducible image files yet; I've got
some patches with partial progress here:
https://github.com/bnewbold/openwrt-repro/compare/master...repro
These are mostly just passing an existing TIMESTAMP variable (from version
control) through to tar, having gzip not make timestamps, sorting a text
file, etc.
The next things to tackle would be kernel images and a few more packages
that capture timestamps. Also, with squashfs (vs tar), device files like
/dev/console are problematic because they can't be "touched" to change
mtime for mksquashfs.
Thanks for not only pushing through so much progress within Debian but
also setting up this example infrastructure for OpenWRT, BSDs, etc.
Inspiring!
--bryan
[0]: https://reproducible.debian.net/openwrt/openwrt.html
[1]: http://wiki.openwrt.org/doc/howto/obtain.firmware.generate
[2]: http://buffalo.nas-central.org/wiki/How_to_Extract_an_uImage
More information about the Reproducible-builds
mailing list