I’ve managed to get FreeBSD booting to Single user mode on a BeagleBoard. I’ve uploaded a patch of the changes made. My plan now is to clean it up and submit it in stages for feedback.
This wouldn’t have been possible without the work of Ben Gray for the initial work, Mark Murry for porting the patch to a newer version of FreeBSD and Andrew Thompson for donating the hardware.
I have been punished rewarded for submitting patches to FreeBSD with a commit bit. I’ll initially be working on improving support for the Samsung s3c24x0 ARM cpu’s. I also have some network driver changes that will be useful for embedded boards.
Thank you to Warner, who is my mentor, for offering to mentor me and the previous core team for approving the bit.
I have started my own FreeBSD and Linux consulting business. It focuses on custom FreeBSD and Linux development at any level of the stack, from Kernel device drivers to custom GUI apps. I’m also working on a product that will be useful for companies wanting to work with FreeBSD in an embedded environment.
If you need a good developer to work on your project you should contact me.
Support for FreeBSD on the Samsung S3C2410 and S3C2440 has landed in -CURRENT. I’m currently working on supporting more device drivers and making it easier to configure, on a board level, which devices to use. There are patches for some of these that should land in HEAD soon. Support for the Neo Freerunner/1973 is not in HEAD as there is no support for it’s media (NAND flash or SD/MMC) in HEAD yet.
Semihalf has released their NAND flash driver for FreeBSD. I have been working on support for S3c24x0 micro’s and reviewing the code in preparation of it being merged into subversion.
I’ve just released a patch to FreeBSD 8-CURRENT to get it booting to single user mode on the Neo1973 emulator. I’ve written up some notes on using it the OpenMoko wiki. It’s best if you already know a bit about building FreeBSD as it can take some effort to build everything needed. However if you have an interest in testing it and giving me feedback I encourage you to give it a go.
In other news it appears I’m famous in Russia (Google translation)
The following is my trip report for the recent BSDCan 2008 conference.
Contacts I made
I met Philip Paeps, Warner Losh, Rafal Jaworowski, Marcel Moolenaar, Joe Marcus Clarke, Andrew Thompson, Murray Stokely, Scott Ullrich from pfSence who I have had contact with previously.
I also met with Adrian Clark at the airport the day after the conference who lent me an OLPC to start porting the FreeBSD loader to.
What I accomplished by attending the conference
- Worked around a bug with ACPI on my Dell laptop where reading from the Embedded Controller could fail leaving me with no CPU fan. This means I can boot FreeBSD on my laptop for more than 5 minutes.
- Managed to get the port of FreeBSD to the NEO 1973 to the point it is running init. More work is needed in the CPU code to get the UART to act as a tty. These changes are in Perforce.
- I discussed with Rafel the current status of the Efika port of FreeBSD/powerpc as I have done most of the previous work to get FreeBSD working on this platform.
- With Rafal and Marcel we started to think about a generic On Chip Bus driver to describe the devices attached to a cpu’s internal bus without having to rewrite generic code too much. We looked into using parts of ACPI to describe the devices as there are already tools in the base system to handle the compliation of it’s description language.
- Creating a new (joke) module, compat_debian, to be compatable with the Debian openssl security issue announced during the conference.
- I started a poert of the FreeBSD i386 loader to the OLPC. It contains a copy of OpenFirmware. The firmware on the laptop I had access to doesn’t however emulate the BIOS.
What I learned
The main things I learned was the around FreeBSD on smaller and embedded systems. The most useful was the changed Rafel has made to U-Boot. I intend to use this work to help the port of FreeBSD to the NEO1973 cellphone by allowing it’s copy of U-Boot to load loader and give users more control on loading and to set kernel arguments.
His other talk helped my understanding of the naming scheme of the various ARM families/architecture versions/cores. Warner’s talk on the history of the MIPS talk was useful as it allowed me to meet with him for the first time and get an idea on his thoughts on what needs to be done for FreeBSD on embedded systems.
My work towards creating a front end for freebsd-update is progressing. I have it at the point where it is exchanging dummy information about the patches on a machine. I’ve added signal handlers to shut down the back end correctly. The network code is fixed when the back end attempts to disconnect and reconnect.
I still need to write the code to detect the downloaded and installed patches. I am also working on the install_patches handler. It will need a functions written to extract the relevant data from the calls argument. When the install_patches handler is able to at least return some dummy information I will hook the new install button to a call.
When the list_updates and install_patches handlers work I’ll have to wait for a security announcement to test it with. Until then I’ll just have to use my local update server.
Andrew Thompson informed the NZFUG list there is now a New Zealand FreeBSD wiki. It’s for *BSD users in New Zealand.
I’ve managed to get my front and back ends talking to each other. The front-end is written in Python. It loads a Glade file and uses that to generate the window to display.
To run it you need a copy of //depot/projects/soc2007/andrew-update/ from perforce. Run ‘make’ to build it. Next, from the backend directory, run ‘facund-be -c freebsd-config-control.conf’. This starts the backend. In a new terminal, from the frontend directory, run ‘python facund.py’. It will open a window with what will become a list of computers on the left with a connect and disconnect button under it. When the connect button is clicked it should attempt to connect to the back-end over the /tmp/facund unix socket and send a start message to the back-end. On disconnect it will send a stop message and wait for the back-end to do the same.
The rest of the communication is yet to be defined but I have a basic idea of the front-end sending a request something like <get value=”available_updates” id=”random_id”/>. The back-end then sends a <return id=”random_id” data=”none”/>. The return data may be changes to allow for non-string types, e.g. bool, int, array, etc.
While reading Planet FreeBSD today Florent Thoumie pointed me to this post. The author is not happy they can’t update a single package they installed with FreeBSD 6.2-RELEASE to the latest version. The problem is they assume the ports collection follows the FreeBSD base.
The first point I noticed is they named 6.2-STABLE 6.2-CURRENT. This tells me they, while may have some experience in using the FreeBSD, don’t know enough about it’s structure. Next they attempt to remove Firefox. They then complain how other ports depend on Firefox. This is because Firefox provides the HTML rendering used by other ports and removing it manually then reinstalling the port is not the best way to update the port.
Next they get to the point of this posting, they attempt to build the Firefox port, find they have to update Xorg and complain this should have gone to 7-CURRENT first. The problem is there is no 7-CURRENT branch for the FreeBSD ports collection. 7-CURRENT is the name of FreeBSD built from the cvs HEAD branch. The ports collection is only tagged for releases (a tag is just a point along a branch). The best strategy is to keep all the ports as up to date as possible so each update is relatively small. It also appears they read the ports UPDATING file, as they pasted some id it to their post, but they didn’t realise they had to update the Xorg port. Sometimes you can get away with not updating a port’s dependencies, but not always. As the ports collection is not branched it is an all or none style update.
They then complain about pkg_add in remote mode. It’s broken due in part to the way FreeBSD packages store their dependencies. They are by exact version, not minimum/maximum versions. This is something I want to fix when I have enough time and libpkg is able to work, without user input, with multiple package formats.
My proposal for the Google Summer of Code to create a frontend for freebsd-update was accepted by the FreeBSD project.
My current design it to have a backend to control freebsd-update. This then talks to the frontend that lets the administrator update the machine and restart services as needed. I will have to come up with a protocol for the back and front ends to communicate in a secure manor. I also want to be able to extend what the backend can do, eg. update ports/packages, restart services or the whole computer.