State of the Debian/Ubuntu arm64 port =====================================
*** Arm64 lives! ***
Executive summary -----------------
* There is now a bootable (raring) image to download and run * Everything has been rebuilt against glibc 2.17 so it works * A bit more work is needed to make the rootfs useable as a native buildd * Multiarch crossbuilding and the build-profile mechanism is mature enough to cross-build a port from scratch (this is a big deal IMHO) * All packages, sources and tools are in a public repo and this work should be reproducible. * This image is fully multiarched so co-installing armhf for a 64/32 mix should work nicely, as should multiarch crossbuilding to legacy x86 architectures. :-) (but I haven't tried that yet...)
* Linaro wants 'the distros' to take this work forward from here so people interested in Debian and Ubuntu on 64-bit arm hardware need to step up and help out.
Bootable images ---------------
A milestone was reached this week: Enough packages were built for arm64 to debootstrap an image which booted to a prompt! After a bit of fettling (and switching to multistrap) I got an image with all the packages configured which boots with upstart to a login prompt (I admit, I did get quite excited about this, as it represents the coming together of nearly 3 years work on multiarch, crossbuilding, bootstrapping, cyclic dependencies and arm64 :-)
The images are available for download: http://wiki.debian.org/Arm64Port#Pre-built_Rootfs And there are destructions there for making your own.
All these packages were cross-built on raring, untangling cyclic dependencies with build profiles (see wiki.debian.org/DebianBootstrap for how that works), making this the first (non x86) self-bootstrapped debian port ever (so far as I know). All (?) previous ports have been done using something else like OpenEmbedded (armel, armhf), RedHat/HardHat (arm, alpha, mips), something IBMy (s390) to get an initial linux rootfs on which debian packages are built.
The new bootstrap process is (almost) just a list of sbuild commands. In practice there are still a few rough edges around cross- build-dependencies so of the 140 packages needed for the bootstrap, 9 had to be built manually with 'dpkg-buildpackage -aarm64 -d' (to skip build-dep checks) instead of 'sbuild --host arm64 <package>'.
The current bootstrap packageset status is here: http://people.linaro.org/~wookey/buildd/raring-arm64/status-bootstrap.html
There is no armv8 (arm64/aarch64) hardware available yet, so this image can currently only be run in a model. ARM provide a free-beer prorietary 'Foundation model' so we do have someting to test with. It's sluggish but perfectly useable. Booting the images takes a couple of minutes on my fairly average machine.
The images are using the Linaro OE release kernels which seem to work fine for this purpose. Thanks to Marcin for modified bootloader lines in .axf files.
Image status ------------
I was impressed that things basically 'just worked' on first boot. There is of course plenty of breakage, I'm sure, and I haven't looked very hard yet, but it's a lot better than I expected after months of just building stuff and testing nothing. (Things that are poorly: nano can't parse it's own syntax-coluring files for example, and multiarch perl has the wrong @INC path compiled in; I'm sure there is more). Consider this alpha-grade until it's been used a bit more.
Things that are not yet built which would make the images a lot more useful are apt and a dhcp client. apt needs gnupg needs curl needs nss. The nss cross-build needs fixing to unbung that. A debian chroot without apt turns out to be disappointing quite quickly :-) Expect an updated image with more packages very soon.
Multiarch crossbuilding -----------------------
It's really nice to have building and crossbuilding using exactly the same mechanisms and tools, with all files having one canonical location, and dependency mechanisms that are reliable. The more I've used this, the more I've been impressed by it. There is still work to do to expand the set of cross-buildable stuff, but it's a solid base to work from.
Getting this port working has been 'interesting' because it's attempting 4 new things all at once: multiarch (file layouts and dependencies), crossbuilding (tools and packaging support in a distro that historically was always natively built), arm64 (aarch64) support in packages that need it, and build-profiles to linearise the build-order.
The arm64 part of this is a relatively small part as the heavy lifting has been done upstream (gcc, (e)glibc, binutils, kernel, libffi, autotools and a lot of minor fixes in various packages). Thanks are due to doko (Matthias Klose) for sterling work getting all that integrated into the debian and ubuntu toolchain packages, and infinity (Adam Conrad) for merging various eglibc branches. There were also hordes of very boring patches of the form 'update config.sub and guess before building'.
Most of the work has been in making things cross-build (exactly the same fixes needed for armel/hf too so I've had plenty of help there from canonical types who want cross-building for arm to work nicely), and particular thinks to Neil Williams for taking on the perl cross-build challenge and creating the debian-perl-cross package to manage the cross-configury, whilst also working with upstream to make the whole thing a bit less 1996.
Multiarchifying has been going on nicely in libraries and -dev packages, but things like perl and python needed significant work, along with a lot of boring bugs saying 'mark this package MA: foreign' and 'build-dep on python:any or perl-base:any'. Thanks are due to doko for the python multiarching and Niko Tyni for the perl multiarchification. Getting all 3 'aspects' of multiarch perl, cross-built perl and arm64 perl config to work at the same time was quite hard work, and there are still bugs there. Wider usage of multiarched perl would no doubt sort this out reasonably quickly. I started a wiki page to track the status of multiarched cross-buildable perl: http://wiki.debian.org/Multiarch/Perl . Help would be welcome.
The build-profile work is described on the http://wiki.debian.org/DebianBootstrap page. Progress has been greatly helped by GSOC projects last year, with good work on the tools (crossbuild-essential packages, build-profile support) from P.J McDermott and an impressive contribution from Johannes Schauer on dependency analysis tools around libdose, and apt build-profile support.
All of this apart from multiarch perl, crossbuildable perl and build-profile stuff (and a few pending patches) is already in raring.
Building stuff yourself -----------------------
Setting up an arm64 build environment is very simple. Use sbuild-createchroot or mk-sbuild and point at the bootstrap repo, with a bit of config and some updated tools packages from the repo (amd64 only supplied). Details are given on https://wiki.linaro.org/Platform/DevPlatform/CrossCompile/arm64bootstrap
Once you've created a tarball chroot builds are simply done with sbuild -c quantal-amd64-sbuild -d quantal --host=arm64 <package.dsc> or sbuild -c quantal-amd64-sbuild -d quantal --host=arm64 <package>_<version> (I'd love it if sbuild got smart enough to work out the version itself when given a distro - Roger says he's working on it)
To deal with the chore of 'find version, run sbuild, sign result, upload to repo, import to repo, deal with reprepro bitching if you re-upload the same version of something' for every package build, I wrote 'dimstrap' which is a simple-minded tool to wrap that up and either do one-off builds or run through a list. It is part of the xbuilder package here: https://launchpad.net/~linaro-foundations/+archive/cross-build-tools/ It also includes the logfile-parsing script ('generate html') which generates the nice status pages: http://people.linaro.org/~wookey/buildd/raring-arm64/status-bootstrap.html
Image building --------------
The config and instructions provided (in http://wiki.debian.org/Arm64Port#Building_your_own_rootfs_image ) is for multistrap. Debootstrap sort-of produces working images too but takes a lot longer to unpack/configure, and misses out various vital packages (like libperl5.14). I'm sure it could be kicked into submission. In theory multistrap (apt really) should have got all the arch all packages from the main repo, but in practice it refused to do that so I had to rebuild them or copy them over anyway (grumble).
Any package that installs replaced conffiles seems to generate invalid dpkg status entries (ifupdown did this to me). I've not got to the bottom of that yet. Deleting the offending line gets you an image that works.
Issues ------
General:
The build-profile patches for dpkg and apt need to be pushed into the distro to make that feature permanent. A thread on debian-devel is working on that (http://debian.2.n7.nabble.com/Bootstrappable-Debian-proposal-of-needed-chang...). The main issue is what syntax to use '<>' or '[]' and how to deal with multiple overlapping profiles. The patches to debian control cannot go in until at least the syntax is agreed and the tools will parse them without barfing. Johannes ands I will send an updated spec soonish.
The missing piece of bootstrapping with regard to build-deps is packages that build-dep on gcc-4.6 or binutils. When cross-building this should be satisfied by <triplet>-gcc-4.6 or <triplet>-binutils. Nothing makes that happen currently. A scheme has been mooted but nothing is implemented yet.
There is debate about whether cross-toolchains should build against multiarch libraries (libgcc, libstdc++) like everything else, or have their own internal copies. Doko and I disagree on this matter. That will need to be worked out at some point.
We won't get that much further with fixing cross- object-introspection, which is a non-trivial job.
Image-related:
The images do essentially work but very little has been tested so far.
Multiarch perl still needs work.
nss needs cross-building in order to get apt cross-built
I've not got networking working yet. Info is here: https://fedoraproject.org/wiki/Architectures/ARM/AArch64/FoundationModel_Net... lack of a dhcp client in the image hasn't helped there.
More info ---------
The canonical arm64 port info page is: http://wiki.debian.org/Arm64Port
Full arm64 cross-build status (i.e everything that has been tried) is here: http://people.linaro.org/~wookey/buildd/raring-arm64/status.html
All the patches generated so far are here: http://people.debian.org/~wookey/bootstrap/patches/
(most that can, have been filed as bugs - there is a backlog of stuff filed in Launchpad but not yet forwarded to the Debian BTS - yes I am a bad boy - blame the fact that you can't use reportbug or bts from inside ARM due to their idiotic email policies).
Future work -----------
Firstly we should say thank you to Linaro for sponsoring this work in various ways over the last 3 years. We wouldn't be at this point now if it wasn't for that. However Linaro has a lot of things to do and is trying hard not to do distro's work for them, concentrating on upstream things. This makes sense for commercially-backed distros like Red Hat and Ubuntu, but rather less for Debian where we _are_ the distro just as much as anyone else is, and ultimately someone has to spend the time to get stuff working.
Anyway, I was supposed to stop work on this some time back, but have largely failed to do so (cross-building is so moreish - there is always one more build to try before bedtime!) and appreciate being given enough slack to get this to a point of actual utility. However I expect to have much less time to spend on this from now on, except insofar as it still co-oncides with things Linaro wants doing. I'd love to hear from people who actually want to use this, to get more packages built, the Debian cross-toolchains sorted, build-profiles finalised, and a whole pile of stuff fixed once Wheezy is released. I'm pretty sure there are quite a lot of people who want multiarch Debian or Ubuntu on their arm64 machines (or models).
I hear rumours that actual hardware may appear sometime around the middle of the year with some bagsied for Debian. Setting up the ports infrastructure for that would be good. I don't know if anyone is interested in building slowly on models in the meantime, or if we should just carry on crossing and see how far we get. This table shows that 471 packages in raring can be expected to cross-build already: http://people.canonical.com/~cjwatson/cross/armhf/raring/
Todo:
Fix up multiarch/cross perl Fix nss Build missing packages for apt Build missing packages for build-essential Build Debian cross-toolchain Get all this working in unstable as well as raring Setup buildds Build all the other packages Set up automated bootstraping runs (eventually)
Current setup -------------
Builds have all been run locally using the sbuild/chroot setup described above and on the Arm64Port page, which should be easy for anyone to reproduce. The main irritation is keeping up with raring: out of sync libraries are not MA-installable. Logs are uploaded to people.linaro.org (rsync). The reprepro repo is on people.debian.org (dupload). This stuff should probably move to ports.debian.org and ports.ubuntu.com, but neither of those are set up for cross-building so I'm not quite sure how this will work.
I could go on at great length about the machinery of profiled bootstrap builds, and interactions between tools, but it's not very exciting, so will resist. Suffice it to say that whilst it's all pretty slick I'd still like better buildd tools.
Build-profile changes ---------------------
The build-profile patches are not yet upstreamable so are collecting in the repo. The patch set so far is here: http://people.debian.org/~wookey/bootstrap/patches/profiles/packages/
Other thanks: Other people who have helped make this happen in various ways but not got a mention above: Colin Watson, Dmitry Ledkovs, Steve Langasek, Harry Leibel, Thibaut Girka, Roger Leigh, Marcus Shawcroft, James Morrisey, Jonathan Austin, Steve McIntyre, Peter Pearse, Aurelien Jarno, and whoever does sysadmin at people.{linaro,debian}.org
I hope I didn't forget anyone, or any important information.
Feedback from anyone attempting to get this working outside my computer is very welcome. I have almost certainly forgotten to write down some things, and upload correct versions of some other things.
Wookey
On 27 February 2013 04:10, Wookey wookey@wookware.org wrote:
State of the Debian/Ubuntu arm64 port
*** Arm64 lives! ***
Awesome work Wookey!
Executive summary
There is now a bootable (raring) image to download and run
Everything has been rebuilt against glibc 2.17 so it works
A bit more work is needed to make the rootfs useable as a native buildd
Multiarch crossbuilding and the build-profile mechanism is mature enough to cross-build a port from scratch (this is a big deal IMHO)
All packages, sources and tools are in a public repo and this work should be reproducible.
This image is fully multiarched so co-installing armhf for a 64/32 mix should work nicely, as should multiarch crossbuilding to legacy x86 architectures. :-) (but I haven't tried that yet...)
Linaro wants 'the distros' to take this work forward from here so people interested in Debian and Ubuntu on 64-bit arm hardware need to step up and help out.
Bootable images
A milestone was reached this week: Enough packages were built for arm64 to debootstrap an image which booted to a prompt! After a bit of fettling (and switching to multistrap) I got an image with all the packages configured which boots with upstart to a login prompt (I admit, I did get quite excited about this, as it represents the coming together of nearly 3 years work on multiarch, crossbuilding, bootstrapping, cyclic dependencies and arm64 :-)
The images are available for download: http://wiki.debian.org/Arm64Port#Pre-built_Rootfs And there are destructions there for making your own.
All these packages were cross-built on raring, untangling cyclic dependencies with build profiles (see wiki.debian.org/DebianBootstrap for how that works), making this the first (non x86) self-bootstrapped debian port ever (so far as I know). All (?) previous ports have been done using something else like OpenEmbedded (armel, armhf), RedHat/HardHat (arm, alpha, mips), something IBMy (s390) to get an initial linux rootfs on which debian packages are built.
The new bootstrap process is (almost) just a list of sbuild commands. In practice there are still a few rough edges around cross- build-dependencies so of the 140 packages needed for the bootstrap, 9 had to be built manually with 'dpkg-buildpackage -aarm64 -d' (to skip build-dep checks) instead of 'sbuild --host arm64 <package>'.
The current bootstrap packageset status is here: http://people.linaro.org/~wookey/buildd/raring-arm64/status-bootstrap.html
There is no armv8 (arm64/aarch64) hardware available yet, so this image can currently only be run in a model. ARM provide a free-beer prorietary 'Foundation model' so we do have someting to test with. It's sluggish but perfectly useable. Booting the images takes a couple of minutes on my fairly average machine.
The images are using the Linaro OE release kernels which seem to work fine for this purpose. Thanks to Marcin for modified bootloader lines in .axf files.
Image status
I was impressed that things basically 'just worked' on first boot. There is of course plenty of breakage, I'm sure, and I haven't looked very hard yet, but it's a lot better than I expected after months of just building stuff and testing nothing. (Things that are poorly: nano can't parse it's own syntax-coluring files for example, and multiarch perl has the wrong @INC path compiled in; I'm sure there is more). Consider this alpha-grade until it's been used a bit more.
Things that are not yet built which would make the images a lot more useful are apt and a dhcp client. apt needs gnupg needs curl needs nss. The nss cross-build needs fixing to unbung that. A debian chroot without apt turns out to be disappointing quite quickly :-) Expect an updated image with more packages very soon.
Multiarch crossbuilding
It's really nice to have building and crossbuilding using exactly the same mechanisms and tools, with all files having one canonical location, and dependency mechanisms that are reliable. The more I've used this, the more I've been impressed by it. There is still work to do to expand the set of cross-buildable stuff, but it's a solid base to work from.
Getting this port working has been 'interesting' because it's attempting 4 new things all at once: multiarch (file layouts and dependencies), crossbuilding (tools and packaging support in a distro that historically was always natively built), arm64 (aarch64) support in packages that need it, and build-profiles to linearise the build-order.
The arm64 part of this is a relatively small part as the heavy lifting has been done upstream (gcc, (e)glibc, binutils, kernel, libffi, autotools and a lot of minor fixes in various packages). Thanks are due to doko (Matthias Klose) for sterling work getting all that integrated into the debian and ubuntu toolchain packages, and infinity (Adam Conrad) for merging various eglibc branches. There were also hordes of very boring patches of the form 'update config.sub and guess before building'.
Most of the work has been in making things cross-build (exactly the same fixes needed for armel/hf too so I've had plenty of help there from canonical types who want cross-building for arm to work nicely), and particular thinks to Neil Williams for taking on the perl cross-build challenge and creating the debian-perl-cross package to manage the cross-configury, whilst also working with upstream to make the whole thing a bit less 1996.
Multiarchifying has been going on nicely in libraries and -dev packages, but things like perl and python needed significant work, along with a lot of boring bugs saying 'mark this package MA: foreign' and 'build-dep on python:any or perl-base:any'. Thanks are due to doko for the python multiarching and Niko Tyni for the perl multiarchification. Getting all 3 'aspects' of multiarch perl, cross-built perl and arm64 perl config to work at the same time was quite hard work, and there are still bugs there. Wider usage of multiarched perl would no doubt sort this out reasonably quickly. I started a wiki page to track the status of multiarched cross-buildable perl: http://wiki.debian.org/Multiarch/Perl . Help would be welcome.
The build-profile work is described on the http://wiki.debian.org/DebianBootstrap page. Progress has been greatly helped by GSOC projects last year, with good work on the tools (crossbuild-essential packages, build-profile support) from P.J McDermott and an impressive contribution from Johannes Schauer on dependency analysis tools around libdose, and apt build-profile support.
All of this apart from multiarch perl, crossbuildable perl and build-profile stuff (and a few pending patches) is already in raring.
Building stuff yourself
Setting up an arm64 build environment is very simple. Use sbuild-createchroot or mk-sbuild and point at the bootstrap repo, with a bit of config and some updated tools packages from the repo (amd64 only supplied). Details are given on https://wiki.linaro.org/Platform/DevPlatform/CrossCompile/arm64bootstrap
Once you've created a tarball chroot builds are simply done with sbuild -c quantal-amd64-sbuild -d quantal --host=arm64 <package.dsc> or sbuild -c quantal-amd64-sbuild -d quantal --host=arm64 <package>_<version> (I'd love it if sbuild got smart enough to work out the version itself when given a distro - Roger says he's working on it)
To deal with the chore of 'find version, run sbuild, sign result, upload to repo, import to repo, deal with reprepro bitching if you re-upload the same version of something' for every package build, I wrote 'dimstrap' which is a simple-minded tool to wrap that up and either do one-off builds or run through a list. It is part of the xbuilder package here: https://launchpad.net/~linaro-foundations/+archive/cross-build-tools/ It also includes the logfile-parsing script ('generate html') which generates the nice status pages: http://people.linaro.org/~wookey/buildd/raring-arm64/status-bootstrap.html
Image building
The config and instructions provided (in http://wiki.debian.org/Arm64Port#Building_your_own_rootfs_image ) is for multistrap. Debootstrap sort-of produces working images too but takes a lot longer to unpack/configure, and misses out various vital packages (like libperl5.14). I'm sure it could be kicked into submission. In theory multistrap (apt really) should have got all the arch all packages from the main repo, but in practice it refused to do that so I had to rebuild them or copy them over anyway (grumble).
Any package that installs replaced conffiles seems to generate invalid dpkg status entries (ifupdown did this to me). I've not got to the bottom of that yet. Deleting the offending line gets you an image that works.
Issues
General:
The build-profile patches for dpkg and apt need to be pushed into the distro to make that feature permanent. A thread on debian-devel is working on that (http://debian.2.n7.nabble.com/Bootstrappable-Debian-proposal-of-needed-chang...). The main issue is what syntax to use '<>' or '[]' and how to deal with multiple overlapping profiles. The patches to debian control cannot go in until at least the syntax is agreed and the tools will parse them without barfing. Johannes ands I will send an updated spec soonish.
The missing piece of bootstrapping with regard to build-deps is packages that build-dep on gcc-4.6 or binutils. When cross-building this should be satisfied by <triplet>-gcc-4.6 or <triplet>-binutils. Nothing makes that happen currently. A scheme has been mooted but nothing is implemented yet.
There is debate about whether cross-toolchains should build against multiarch libraries (libgcc, libstdc++) like everything else, or have their own internal copies. Doko and I disagree on this matter. That will need to be worked out at some point.
We won't get that much further with fixing cross- object-introspection, which is a non-trivial job.
Image-related:
The images do essentially work but very little has been tested so far.
Multiarch perl still needs work.
nss needs cross-building in order to get apt cross-built
I've not got networking working yet. Info is here: https://fedoraproject.org/wiki/Architectures/ARM/AArch64/FoundationModel_Net... lack of a dhcp client in the image hasn't helped there.
More info
The canonical arm64 port info page is: http://wiki.debian.org/Arm64Port
Full arm64 cross-build status (i.e everything that has been tried) is here: http://people.linaro.org/~wookey/buildd/raring-arm64/status.html
All the patches generated so far are here: http://people.debian.org/~wookey/bootstrap/patches/
(most that can, have been filed as bugs - there is a backlog of stuff filed in Launchpad but not yet forwarded to the Debian BTS - yes I am a bad boy - blame the fact that you can't use reportbug or bts from inside ARM due to their idiotic email policies).
Future work
Firstly we should say thank you to Linaro for sponsoring this work in various ways over the last 3 years. We wouldn't be at this point now if it wasn't for that. However Linaro has a lot of things to do and is trying hard not to do distro's work for them, concentrating on upstream things. This makes sense for commercially-backed distros like Red Hat and Ubuntu, but rather less for Debian where we _are_ the distro just as much as anyone else is, and ultimately someone has to spend the time to get stuff working.
Anyway, I was supposed to stop work on this some time back, but have largely failed to do so (cross-building is so moreish - there is always one more build to try before bedtime!) and appreciate being given enough slack to get this to a point of actual utility. However I expect to have much less time to spend on this from now on, except insofar as it still co-oncides with things Linaro wants doing. I'd love to hear from people who actually want to use this, to get more packages built, the Debian cross-toolchains sorted, build-profiles finalised, and a whole pile of stuff fixed once Wheezy is released. I'm pretty sure there are quite a lot of people who want multiarch Debian or Ubuntu on their arm64 machines (or models).
I hear rumours that actual hardware may appear sometime around the middle of the year with some bagsied for Debian. Setting up the ports infrastructure for that would be good. I don't know if anyone is interested in building slowly on models in the meantime, or if we should just carry on crossing and see how far we get. This table shows that 471 packages in raring can be expected to cross-build already: http://people.canonical.com/~cjwatson/cross/armhf/raring/
Todo:
Fix up multiarch/cross perl Fix nss Build missing packages for apt Build missing packages for build-essential Build Debian cross-toolchain Get all this working in unstable as well as raring Setup buildds Build all the other packages Set up automated bootstraping runs (eventually)
Current setup
Builds have all been run locally using the sbuild/chroot setup described above and on the Arm64Port page, which should be easy for anyone to reproduce. The main irritation is keeping up with raring: out of sync libraries are not MA-installable. Logs are uploaded to people.linaro.org (rsync). The reprepro repo is on people.debian.org (dupload). This stuff should probably move to ports.debian.org and ports.ubuntu.com, but neither of those are set up for cross-building so I'm not quite sure how this will work.
I could go on at great length about the machinery of profiled bootstrap builds, and interactions between tools, but it's not very exciting, so will resist. Suffice it to say that whilst it's all pretty slick I'd still like better buildd tools.
Build-profile changes
The build-profile patches are not yet upstreamable so are collecting in the repo. The patch set so far is here: http://people.debian.org/~wookey/bootstrap/patches/profiles/packages/
Other thanks: Other people who have helped make this happen in various ways but not got a mention above: Colin Watson, Dmitry Ledkovs, Steve Langasek, Harry Leibel, Thibaut Girka, Roger Leigh, Marcus Shawcroft, James Morrisey, Jonathan Austin, Steve McIntyre, Peter Pearse, Aurelien Jarno, and whoever does sysadmin at people.{linaro,debian}.org
I hope I didn't forget anyone, or any important information.
Feedback from anyone attempting to get this working outside my computer is very welcome. I have almost certainly forgotten to write down some things, and upload correct versions of some other things.
Wookey
Principal hats: Linaro, Emdebian, Wookware, Balloonboard, ARM http://wookware.org/
linaro-dev mailing list linaro-dev@lists.linaro.org http://lists.linaro.org/mailman/listinfo/linaro-dev
W dniu 27.02.2013 03:10, Wookey pisze:
State of the Debian/Ubuntu arm64 port
*** Arm64 lives! ***
Congratulations Wookey (and everyone involved)!
- There is now a bootable (raring) image to download and run
Once you've created a tarball chroot builds are simply done with sbuild -c quantal-amd64-sbuild -d quantal --host=arm64 <package.dsc> or sbuild -c quantal-amd64-sbuild -d quantal --host=arm64 <package>_<version> (I'd love it
s/quantal/raring/ I think.
On Wed, 2013-02-27 at 02:10 +0000, Wookey wrote:
Setting up an arm64 build environment is very simple. Use sbuild-createchroot or mk-sbuild and point at the bootstrap repo, with a bit of config and some updated tools packages from the repo (amd64 only supplied). Details are given on https://wiki.linaro.org/Platform/DevPlatform/CrossCompile/arm64bootstrap
I think these are missing a "dpkg --add-architecture arm64" at some point before apt-get update / install crossbuild-essential-arm64 ?
I tried to adjust those instructions to something similar for Sid + the debian-bootstrap repo but there were unmet dependencies of crossbuild-essential-arm64 (libc, pkgbinarymangler), but I get the impression that is to be expected at this stage?
Ian.
+++ Ian Campbell [2013-02-27 12:00 +0000]:
On Wed, 2013-02-27 at 02:10 +0000, Wookey wrote:
Setting up an arm64 build environment is very simple. Use sbuild-createchroot or mk-sbuild and point at the bootstrap repo, with a bit of config and some updated tools packages from the repo (amd64 only supplied). Details are given on https://wiki.linaro.org/Platform/DevPlatform/CrossCompile/arm64bootstrap
I think these are missing a "dpkg --add-architecture arm64" at some point before apt-get update / install crossbuild-essential-arm64 ?
Yes, good point. Now fixed on the wiki page, along with some s/quantal/raring/
Sbuild will do this for you before updating/installing, but when doing stuff manually in the chroot (as those instructions suggest for pre-installing crossbuild-essential-arm64) you do indeed need to add the foreign architecture(s).
I tried to adjust those instructions to something similar for Sid + the debian-bootstrap repo but there were unmet dependencies of crossbuild-essential-arm64 (libc, pkgbinarymangler), but I get the impression that is to be expected at this stage?
You won't get anywhere in Sid at the moment: No prebuilt cross-toolchain, and some of the multiarch info missing. If you actually want to _use_ this (as opposed to fix it) then it has to be raring.
I had to choose between getting this working in vaguely finite time and keeping both Debian and Ubuntu bootstraps in sync, so unstable just got stuck at the 'toolchain bootstrap needed' stage. Is raring useful to you or do you need sid? Once the toolchain is done it shouldn't be _too_ much work to get Debian uptodate although there will be a _lot_ of patched packages.
Wookey
On Wed, 2013-02-27 at 13:37 +0000, Wookey wrote:
I had to choose between getting this working in vaguely finite time and keeping both Debian and Ubuntu bootstraps in sync, so unstable just got stuck at the 'toolchain bootstrap needed' stage.
That's quite reasonable
Is raring useful to you or do you need sid? Once the toolchain is done it shouldn't be _too_ much work to get Debian uptodate although there will be a _lot_ of patched packages.
Raring is fine, just reached for Debian out of habit etc.
To be honest I'm probably getting a little bit ahead of myself anyway -- I'm working on aarch64 guest support for Xen at the minute and your mail prompted me to wonder how hard it would be to build the Xen tools for arm64 in a multiarch environment, to some extent the toolchain is the least of my worries ;-).
Ian.
On Tue, Feb 26, 2013 at 11:10 PM, Wookey wookey@wookware.org wrote:
State of the Debian/Ubuntu arm64 port
*** Arm64 lives! ***
Hi,
Is there any device with Aarch64 on sale? I couldn't find any, only some mentions from Calxeda. Would you mind to provide suggestions of any seller which sells through the internet?
On Wed, Feb 27, 2013 at 06:38:55PM -0300, Cláudio Sampaio wrote:
Is there any device with Aarch64 on sale? I couldn't find any, only some mentions from Calxeda. Would you mind to provide suggestions of any seller which sells through the internet?
There are none for sale yet. I believe some prototype chips exist, as does an emulator from ARM.
Nice work, Wookey! If experience cross-building for armhf is any guide, all you need for NSS is a host build of shlibsign; see https://github.com/mkedwards/crosstool-ng/blob/master/patches/nss/3.12.10/00.... There's also scriptage in that repo for the build sequence and cross parameters: https://github.com/mkedwards/crosstool-ng/blob/master/scripts/build/cross_me.... It's ugly in places (cross pkgconfig was kind of wonky at the time) but may help you get past NSS and on to apt.
Cheers, - Michael On Feb 26, 2013 6:11 PM, "Wookey" wookey@wookware.org wrote:
State of the Debian/Ubuntu arm64 port
*** Arm64 lives! ***
Executive summary
- There is now a bootable (raring) image to download and run
- Everything has been rebuilt against glibc 2.17 so it works
- A bit more work is needed to make the rootfs useable as a native buildd
- Multiarch crossbuilding and the build-profile mechanism is mature
enough to cross-build a port from scratch (this is a big deal IMHO)
- All packages, sources and tools are in a public repo and this work
should be reproducible.
This image is fully multiarched so co-installing armhf for a 64/32 mix should work nicely, as should multiarch crossbuilding to legacy x86 architectures. :-) (but I haven't tried that yet...)
Linaro wants 'the distros' to take this work forward from here so
people interested in Debian and Ubuntu on 64-bit arm hardware need to step up and help out.
Bootable images
A milestone was reached this week: Enough packages were built for arm64 to debootstrap an image which booted to a prompt! After a bit of fettling (and switching to multistrap) I got an image with all the packages configured which boots with upstart to a login prompt (I admit, I did get quite excited about this, as it represents the coming together of nearly 3 years work on multiarch, crossbuilding, bootstrapping, cyclic dependencies and arm64 :-)
The images are available for download: http://wiki.debian.org/Arm64Port#Pre-built_Rootfs And there are destructions there for making your own.
All these packages were cross-built on raring, untangling cyclic dependencies with build profiles (see wiki.debian.org/DebianBootstrap for how that works), making this the first (non x86) self-bootstrapped debian port ever (so far as I know). All (?) previous ports have been done using something else like OpenEmbedded (armel, armhf), RedHat/HardHat (arm, alpha, mips), something IBMy (s390) to get an initial linux rootfs on which debian packages are built.
The new bootstrap process is (almost) just a list of sbuild commands. In practice there are still a few rough edges around cross- build-dependencies so of the 140 packages needed for the bootstrap, 9 had to be built manually with 'dpkg-buildpackage -aarm64 -d' (to skip build-dep checks) instead of 'sbuild --host arm64 <package>'.
The current bootstrap packageset status is here:
http://people.linaro.org/~wookey/buildd/raring-arm64/status-bootstrap.html
There is no armv8 (arm64/aarch64) hardware available yet, so this image can currently only be run in a model. ARM provide a free-beer prorietary 'Foundation model' so we do have someting to test with. It's sluggish but perfectly useable. Booting the images takes a couple of minutes on my fairly average machine.
The images are using the Linaro OE release kernels which seem to work fine for this purpose. Thanks to Marcin for modified bootloader lines in .axf files.
Image status
I was impressed that things basically 'just worked' on first boot. There is of course plenty of breakage, I'm sure, and I haven't looked very hard yet, but it's a lot better than I expected after months of just building stuff and testing nothing. (Things that are poorly: nano can't parse it's own syntax-coluring files for example, and multiarch perl has the wrong @INC path compiled in; I'm sure there is more). Consider this alpha-grade until it's been used a bit more.
Things that are not yet built which would make the images a lot more useful are apt and a dhcp client. apt needs gnupg needs curl needs nss. The nss cross-build needs fixing to unbung that. A debian chroot without apt turns out to be disappointing quite quickly :-) Expect an updated image with more packages very soon.
Multiarch crossbuilding
It's really nice to have building and crossbuilding using exactly the same mechanisms and tools, with all files having one canonical location, and dependency mechanisms that are reliable. The more I've used this, the more I've been impressed by it. There is still work to do to expand the set of cross-buildable stuff, but it's a solid base to work from.
Getting this port working has been 'interesting' because it's attempting 4 new things all at once: multiarch (file layouts and dependencies), crossbuilding (tools and packaging support in a distro that historically was always natively built), arm64 (aarch64) support in packages that need it, and build-profiles to linearise the build-order.
The arm64 part of this is a relatively small part as the heavy lifting has been done upstream (gcc, (e)glibc, binutils, kernel, libffi, autotools and a lot of minor fixes in various packages). Thanks are due to doko (Matthias Klose) for sterling work getting all that integrated into the debian and ubuntu toolchain packages, and infinity (Adam Conrad) for merging various eglibc branches. There were also hordes of very boring patches of the form 'update config.sub and guess before building'.
Most of the work has been in making things cross-build (exactly the same fixes needed for armel/hf too so I've had plenty of help there from canonical types who want cross-building for arm to work nicely), and particular thinks to Neil Williams for taking on the perl cross-build challenge and creating the debian-perl-cross package to manage the cross-configury, whilst also working with upstream to make the whole thing a bit less 1996.
Multiarchifying has been going on nicely in libraries and -dev packages, but things like perl and python needed significant work, along with a lot of boring bugs saying 'mark this package MA: foreign' and 'build-dep on python:any or perl-base:any'. Thanks are due to doko for the python multiarching and Niko Tyni for the perl multiarchification. Getting all 3 'aspects' of multiarch perl, cross-built perl and arm64 perl config to work at the same time was quite hard work, and there are still bugs there. Wider usage of multiarched perl would no doubt sort this out reasonably quickly. I started a wiki page to track the status of multiarched cross-buildable perl: http://wiki.debian.org/Multiarch/Perl . Help would be welcome.
The build-profile work is described on the http://wiki.debian.org/DebianBootstrap page. Progress has been greatly helped by GSOC projects last year, with good work on the tools (crossbuild-essential packages, build-profile support) from P.J McDermott and an impressive contribution from Johannes Schauer on dependency analysis tools around libdose, and apt build-profile support.
All of this apart from multiarch perl, crossbuildable perl and build-profile stuff (and a few pending patches) is already in raring.
Building stuff yourself
Setting up an arm64 build environment is very simple. Use sbuild-createchroot or mk-sbuild and point at the bootstrap repo, with a bit of config and some updated tools packages from the repo (amd64 only supplied). Details are given on https://wiki.linaro.org/Platform/DevPlatform/CrossCompile/arm64bootstrap
Once you've created a tarball chroot builds are simply done with sbuild -c quantal-amd64-sbuild -d quantal --host=arm64 <package.dsc> or sbuild -c quantal-amd64-sbuild -d quantal --host=arm64 <package>_<version> (I'd love it if sbuild got smart enough to work out the version itself when given a distro - Roger says he's working on it)
To deal with the chore of 'find version, run sbuild, sign result, upload to repo, import to repo, deal with reprepro bitching if you re-upload the same version of something' for every package build, I wrote 'dimstrap' which is a simple-minded tool to wrap that up and either do one-off builds or run through a list. It is part of the xbuilder package here: https://launchpad.net/~linaro-foundations/+archive/cross-build-tools/ It also includes the logfile-parsing script ('generate html') which generates the nice status pages: http://people.linaro.org/~wookey/buildd/raring-arm64/status-bootstrap.html
Image building
The config and instructions provided (in http://wiki.debian.org/Arm64Port#Building_your_own_rootfs_image ) is for multistrap. Debootstrap sort-of produces working images too but takes a lot longer to unpack/configure, and misses out various vital packages (like libperl5.14). I'm sure it could be kicked into submission. In theory multistrap (apt really) should have got all the arch all packages from the main repo, but in practice it refused to do that so I had to rebuild them or copy them over anyway (grumble).
Any package that installs replaced conffiles seems to generate invalid dpkg status entries (ifupdown did this to me). I've not got to the bottom of that yet. Deleting the offending line gets you an image that works.
Issues
General:
The build-profile patches for dpkg and apt need to be pushed into the distro to make that feature permanent. A thread on debian-devel is working on that ( http://debian.2.n7.nabble.com/Bootstrappable-Debian-proposal-of-needed-chang... ). The main issue is what syntax to use '<>' or '[]' and how to deal with multiple overlapping profiles. The patches to debian control cannot go in until at least the syntax is agreed and the tools will parse them without barfing. Johannes ands I will send an updated spec soonish.
The missing piece of bootstrapping with regard to build-deps is packages that build-dep on gcc-4.6 or binutils. When cross-building this should be satisfied by <triplet>-gcc-4.6 or <triplet>-binutils. Nothing makes that happen currently. A scheme has been mooted but nothing is implemented yet.
There is debate about whether cross-toolchains should build against multiarch libraries (libgcc, libstdc++) like everything else, or have their own internal copies. Doko and I disagree on this matter. That will need to be worked out at some point.
We won't get that much further with fixing cross- object-introspection, which is a non-trivial job.
Image-related:
The images do essentially work but very little has been tested so far.
Multiarch perl still needs work.
nss needs cross-building in order to get apt cross-built
I've not got networking working yet. Info is here:
https://fedoraproject.org/wiki/Architectures/ARM/AArch64/FoundationModel_Net... lack of a dhcp client in the image hasn't helped there.
More info
The canonical arm64 port info page is: http://wiki.debian.org/Arm64Port
Full arm64 cross-build status (i.e everything that has been tried) is here: http://people.linaro.org/~wookey/buildd/raring-arm64/status.html
All the patches generated so far are here: http://people.debian.org/~wookey/bootstrap/patches/
(most that can, have been filed as bugs - there is a backlog of stuff filed in Launchpad but not yet forwarded to the Debian BTS - yes I am a bad boy - blame the fact that you can't use reportbug or bts from inside ARM due to their idiotic email policies).
Future work
Firstly we should say thank you to Linaro for sponsoring this work in various ways over the last 3 years. We wouldn't be at this point now if it wasn't for that. However Linaro has a lot of things to do and is trying hard not to do distro's work for them, concentrating on upstream things. This makes sense for commercially-backed distros like Red Hat and Ubuntu, but rather less for Debian where we _are_ the distro just as much as anyone else is, and ultimately someone has to spend the time to get stuff working.
Anyway, I was supposed to stop work on this some time back, but have largely failed to do so (cross-building is so moreish - there is always one more build to try before bedtime!) and appreciate being given enough slack to get this to a point of actual utility. However I expect to have much less time to spend on this from now on, except insofar as it still co-oncides with things Linaro wants doing. I'd love to hear from people who actually want to use this, to get more packages built, the Debian cross-toolchains sorted, build-profiles finalised, and a whole pile of stuff fixed once Wheezy is released. I'm pretty sure there are quite a lot of people who want multiarch Debian or Ubuntu on their arm64 machines (or models).
I hear rumours that actual hardware may appear sometime around the middle of the year with some bagsied for Debian. Setting up the ports infrastructure for that would be good. I don't know if anyone is interested in building slowly on models in the meantime, or if we should just carry on crossing and see how far we get. This table shows that 471 packages in raring can be expected to cross-build already: http://people.canonical.com/~cjwatson/cross/armhf/raring/
Todo:
Fix up multiarch/cross perl Fix nss Build missing packages for apt Build missing packages for build-essential Build Debian cross-toolchain Get all this working in unstable as well as raring Setup buildds Build all the other packages Set up automated bootstraping runs (eventually)
Current setup
Builds have all been run locally using the sbuild/chroot setup described above and on the Arm64Port page, which should be easy for anyone to reproduce. The main irritation is keeping up with raring: out of sync libraries are not MA-installable. Logs are uploaded to people.linaro.org (rsync). The reprepro repo is on people.debian.org (dupload). This stuff should probably move to ports.debian.org and ports.ubuntu.com, but neither of those are set up for cross-building so I'm not quite sure how this will work.
I could go on at great length about the machinery of profiled bootstrap builds, and interactions between tools, but it's not very exciting, so will resist. Suffice it to say that whilst it's all pretty slick I'd still like better buildd tools.
Build-profile changes
The build-profile patches are not yet upstreamable so are collecting in the repo. The patch set so far is here: http://people.debian.org/~wookey/bootstrap/patches/profiles/packages/
Other thanks: Other people who have helped make this happen in various ways but not got a mention above: Colin Watson, Dmitry Ledkovs, Steve Langasek, Harry Leibel, Thibaut Girka, Roger Leigh, Marcus Shawcroft, James Morrisey, Jonathan Austin, Steve McIntyre, Peter Pearse, Aurelien Jarno, and whoever does sysadmin at people.{linaro,debian}.org
I hope I didn't forget anyone, or any important information.
Feedback from anyone attempting to get this working outside my computer is very welcome. I have almost certainly forgotten to write down some things, and upload correct versions of some other things.
Wookey
Principal hats: Linaro, Emdebian, Wookware, Balloonboard, ARM http://wookware.org/
cross-distro mailing list cross-distro@lists.linaro.org http://lists.linaro.org/mailman/listinfo/cross-distro
+++ Wookey [2013-02-27 02:10 +0000]:
State of the Debian/Ubuntu arm64 port
*** Arm64 lives! ***
Executive summary
- There is now a bootable (raring) image to download and run
- A bit more work is needed to make the rootfs useable as a native buildd
Networking and apt, and various bits of breakage was fixed shortly after the initial upload.
After some jolly hacking at Connect, with much help from Doko, we got the build and install dependencies of debhelper (what a lot of crap it (recursively) needs!) crossed and uploaded, and fixed some missing perl bits, so I have now successfully built the 'hello' package with the image.
It's such fun to watch configure scroll by one line at a time for about an hour....
Cross-building stuff:
Ian Campbell also got the Xen arm64/aarch64 cross-build working for raring (not yet integrated into the packaging), using the info on https://wiki.linaro.org/Platform/DevPlatform/CrossCompile/arm64bootstrap without too much aggravation (libyajl needed to be cross-fixed first), so the environment is already useful for building and getting stuff cross-ready, so long as you don't have too many build-deps.
Feedback from anyone else who tries this is welcome.
The images are available for download: http://wiki.debian.org/Arm64Port#Pre-built_Rootfs Along with destructions there for making your own.
Wookey