This framework supports Linux on several single board microcomputers. The goal of the MuntsOS project is to deliver a turnkey, RAM resident Linux operating system for very low cost single board microcomputers. With MuntsOS installed, such microcomputers can treated as components, as Linux microcontrollers, and integrated into other projects just like traditional single chip microcontrollers.
-
1 January 2024 -- I have decided to suspend active development for 32-bit platforms. The 32-bit BeagleBone kernel is frozen at 5.4.106. The 32-bit Raspberry Pi 1 and 2 kernels are frozen at 5.15.92. The 32-bit extensions, kernels and thin servers will still be rebuilt from time to time to incorporate userland improvements. The
muntsos-dev
package has been updated to only pull in 64-bit AArch toolchains. -
1 January 2024 -- The 64-bit Raspberry Pi 3 and 4 kernels have been upgraded to 6.1.69 and will track https://github.com/raspberrypi/linux again.
-
6 January 2024 -- Added a libusb extension package. It just installs
/usr/local/lib/libusb-1.0.so.0
, which is no longer included in the kernel RAM file system. -
6 January 2024 -- In the course of porting MuntsOS to the 64-bit Raspberry Pi 5 and the Orange Pi Zero 2 W, the previous naming convention for MuntsOS AArch64 (arm64) extension packages with "RaspberryPi3" has proven shortsighted. Therefore the extension package naming scheme has updated to be more meaningful for all platforms:
dma-muntsos-BeagleBone.deb
becomesdma-muntsos-armhf-beaglebone.deb
dma-muntsos-RaspberryPi1.deb
becomesdma-muntsos-armhf-raspberrypi1.deb
dma-muntsos-RaspberryPi2.deb
becomesdma-muntsos-armhf-raspberrypi2.deb
dma-muntsos-RaspberryPi3.deb
becomesdma-muntsos-aarch64.deb
-
7 January 2024 -- Except for porting MuntsOS to the Raspberry Pi 5, which is ongoing, I have caught up with my backlog of improvements and fixes. Among other things, the MuntsOS startup scripts (
/etc/rc
) and friends have been extensively reworked to prevent race conditions. These changes also improve the system boot time. Support for the Raspberry 5 and the Orange Pi Zero 2 W is under development. -
13 January 2024 -- You can now write programs for MuntsOS in Modula-2, for which support was merged into GCC 13. During the late 1980's and early 1990's, there was a lot of interest in Modula-2 as a system programming language, a more robust alternative to C. As a student and beginning software engineer, I spent real money on at least three different Modula-2 compilers for MS-DOS. Some platform modules and test programs have been moved from libsimpleio to
muntsos/examples/modula2/
. -
13 January 2024 -- Upgraded libcurl to 8.5.0. Upgraded libnl to 3.9.0. Took advantage of the opportunity to fix the cross-tool package dependency chains. Now if you remove the gcc package, all the corresponding free pascal compiler and library packages will be removed as well.
-
20 January 2024 -- Added two new device tree overlays:
disable-ethernet-pi4
anddisable-ethernet-pi5
. These disable the on-board Ethernet interface, exactly likedisable-wifi
disables the on-board WiFi interface. These are useful for boards like the CM4-Duino, which doesn't have an Ethernet connector. -
22 January 2024 -- First cut at the Raspberry Pi 5 kernel is done. Much testing and verification needs to be performed.
-
24 January 2024 -- Reworked the RPM setup scripts setup-fedora and setup-rhel to improve the user experience and to interoperate with Alire better. Verified on Fedora 39 and RHEL lookalikes.
-
25 January 2024 -- Validation of the Raspberry Pi 5 port continues, with few issues found. I did have to implement a fix for a breaking GPIO API change, though, described in Application Note #11.
-
26 January 2024 -- I have now implemented BeagleBone Style GPIO pin configuration managment for 64-bit Raspberry Pi boards, using the
pinctrl
command imported from Raspberry Pi OS. See Application Note #12 for more information. -
30 January 2024 -- Added a Python3 runtime extension package. Python is not my favorite programming language, but it can be useful, and other people seem to like it. The
python3
program source has been patched to disable byte code caching. Byte code caching doesn't make much sense in an embedded system and it increases the storage footprint significantly. The Python3 extension includeslibffi.so
and Linux Simple I/O Library bindings for Python3. -
3 February 2024 -- Upgraded ethtool to 6.7. Fixed an annoying backspace problem by adding
crterase
to thestty
command in/etc/profile
. -
10 February 2024 -- Upgraded the Linux kernel to 6.1.77. The libsimpleio bindings for GNU Modula-2 are now complete. Added Application Note #14, Modula-2 LED Flash Example.
-
28 February 2024 -- Enabled CPU frequency scaling on 64-bit Raspberry Pi boards. The default CPU frequency policy is
performance
for Raspberry Pi 3 and 4 andconservative
for Raspberry Pi 5. The policy can be changed at boot time by writing the desired policy name to/etc/scaling_governor
and runningsysconfig --save
. Note that the Raspberry Pi 3 and 4 I2C and SPI clock frequencies scale with the CPU frequency, and will only be correct at the maximum CPU frequency, which can be guaranteed by theperformance
policy. The Raspberry Pi 5 I2C and SPI clock frequencies are independent of the CPU frequency. -
28 March 2024 -- Reworked Raspberry Pi LED configuration. LEDs are now configured in
config.txt
instead of in/etc/rc
. -
5 April 2024 -- Upgraded 64-bit Raspberry Pi kernels to 6.6.23, the latest longterm Linux kernel.
-
6 April 2024 -- Upgraded 64-bit Raspberry Pi kernels to 6.6.25. Upgraded OpenSSH to 9.7p1. Stopped using prebuilt OpenSSH server keys. Generate only 4096 bit RSA OpenSSH server keys in
/etc/rc
(if necessary) andsysconfig
. -
11 April 2024 -- Upgraded some library components: libusb to 1.0.27, openssl to 3.3.0, curl to 8.7.1, rabbitmq-c to 0.14.0, libffi to 3.4.6, and util-linux to 2.40. Added some new library components: libicu and libcap-ng.
-
12 April 2024 -- Upgraded some extension package components: emailrelay to 2.5.2, openvpn to 2.6.10, .Net Runtime to 8.0.4, python3 to 3.12.3, rsync to 3.3.0, net-snmp to 5.9.4, and tcpdump to 4.99.4
-
7 May 2024 -- Upgraded 64-bit Raspberry Pi kernels to 6.6.30. Added
enscript
extension package. Added Application Note #17 about printing from MuntsOS. -
8 May 2024 -- Added
gnuplot
extension package. Only a few output formats (parameters to theset terminal
plot command) are enabled, and even fewer are useful. In particular:set terminal postscript color
is useful for printing, using a shell command like:gnuplot test.plt | lpr
set terminal svg
is useful for creating an image file suitable for post processing, using a shell command like:gnuplot test.plt > test.svg
-
23 May 2024 -- More component upgrades: ncurses to 6.5, curl to 8.8.0, icu to 75.1, nano to 8.0, Raspberry Pi 64-bit kernels to 6.6.31.
-
15 June 2024 -- Upgraded Raspberry Pi 64-bit kernels to 6.6.33. Upgraded ethtool to 6.9. Added
detach
, a utility program that runs a program in the background. -
30 July 2024 -- Upgraded OpenSSL to 3.3.1, curl to 8.9.0, libtirpc to 1.3.5, libnl to 3.10.0, libsodium to 1.0.20, gdbm to 1.24, and xz to 5.6.2. Upgraded .Net Runtime to 8.0.7, OpenSSH to 9.8p1, rpcbind to 1.2.7, and nano to 8.1. Upgraded the 64-bit Raspberry Pi kernel to 6.6.42.
Instructions for installing the MuntsOS cross-toolchain development environment onto a host computer are found in Application Note #1 and Application Note #2. Or just download and run one of the following quick setup scripts:
setup-debian
setup-fedora
setup-rhel
Instructions for installing MuntsOS to a target computer are found in Application Note #3 and Application Note #15.
The documentation for MuntsOS (mostly application notes) is available online at:
http://git.munts.com/muntsos/doc
MuntsOS is a stripped down Linux distribution that includes a small compressed root file system within the kernel image binary itself. At boot time the root file system is unpacked into RAM and thereafter the system runs entirely in RAM.
Each kernel release tarball contains a kernel image file (.img
),
which may be common to several different microcomputer boards, and one
or more device tree files
(.dtb
) that are specific to particular microcomputer boards. Some
kernel release tarballs also contain one or more device tree overlay
files (.dtbo
) that can make small changes to the device tree at
boot time.
Prebuilt MuntsOS kernel release tarballs are available at:
http://repo.munts.com/muntsos/kernels
The MuntsOS root file system can be extended at boot time using any of three mechanisms:
First, if /boot/tarballs
exists, any gzip
'ed tarball files
(.tgz
) in it will be extracted on top of the root file system.
Typically you would use this mechanism for customized /etc/passwd
,
.ssh/authorized_keys
, and similiar system configuration files.
Secondly, if /boot/packages
exists, any Debian package files
(.deb
) in it will be installed into the root file system. Note
that packages from the Debian project will
probably not work; they must be built specifically for MuntsOS. The
startup script that installs .deb
packages also installs
.rpm
and .nupkg
packages.
The GPIO Server extension package demonstrates how to build a Debian package that adds application specific software to MuntsOS.
Thirdly, the system startup script /etc/rc
can be configured via a
kernel command line option to search for a subdirectory called
autoexec.d
in various places, such as SD card, USB flash drive,
USB CD-ROM or NFS mount. If an autoexec.d
subdirectory is found,
each executable program or script in it will be executed when the system
boots.
The idea is to build a MuntsOS kernel (which takes a long time) once and
install it to the target platform. Then application specific software
can be built after the fact and installed as tarball files in
/boot/tarballs
; Debian, RPM, and NuGet package files in
/boot/packages
; or executable programs and scripts in
/boot/autoexec.d
.
Prebuilt MuntsOS extension packages are available at:
http://repo.munts.com/muntsos/extensions
The Thin Server is a system design pattern that is little more than a network interface for a single I/O device. Ideally, a Thin Server will be built from a cheap and ubiquitous network microcomputer like the Raspberry Pi. The software must be easy to install from a user's PC or Mac without requiring any special programming tools. It must be able to run headless, administered via the network. It must be able to survive without orderly shutdowns, and must not write much to flash media. It must provide a network based API (Application Programming Interface) using HTTP as a lowest common denominator.
MuntsOS, with its operating system running entirely from RAM, serves
well for the Thin Server, and the two concepts have evolved together
over the past few years. The simplest way to use MuntsOS is to download
one of the prebuilt Thin Server .zip
files and extract it to a
freshly formatted FAT32 SD card. You can then modify
autoexec.d/00-wlan-init
on the SD card to pre-configure it for
your wireless network environment, if desired, before inserting it in
the target board. After booting MuntsOS, log in from the console or via
SSH (user "root
", password "default
") and run
sysconfig
to perform more system configuration.
Note: Some platforms require the boot flag to be set on the FAT32 boot partition on the SD card or on-board eMMC. The ROM boot loader in the CPU will ignore any partitions that are not marked as bootable.
MuntsOS Application Notes 3 and 15 contain more detailed instructions about how to install a MuntsOS Thin Server.
Prebuilt MuntsOS Thin Servers are at available at:
http://repo.munts.com/muntsos/thinservers
The Raspberry Pi is a family of low cost Linux microcomputers selling for USD $15 to $80, depending on model. There have been five generations of Raspberry Pi microcomputers, each using a successively more sophisticated Broadcom ARM core CPU. The first two generations (32-bit ARMv6 Raspberry Pi 1 and 32-bit ARMv7 Raspberry Pi 2) are now obsolete.
Some Raspberry Pi models have an on-board Bluetooth radio that uses the serial port signals that are brought out to the expansion header. By default, MuntsOS port disables the on-board Bluetooth radio, in favor of the serial port on the expansion header.
The 64-bit Raspberry Pi 2 Model B Revision 1.2 with the 900 MHz BCM2710 ARMv8 Cortex-A53 quad-core CPU can be treated as a power conserving Raspberry Pi 3 Model Bโ and is useful for industrial applications where wired Ethernet is preferred.
The Rasbperry Pi 3 Model B has a 1200 MHz BCM2710 ARMv8 Cortex-A53 quad-core CPU and has 1 GB of RAM along with on-board Bluetooth and WiFi radios.
The Raspberry Pi 3 Model A+ has the same form factor as the Raspberry Pi 1 Model A+, with only one USB host port and no wired Ethernet. It has a 1400 MHz BCM2710 ARMv8 Cortex-A53 quad-core CPU and has 512 MB of RAM along with on-board Bluetooth and WiFi radios.
The Raspberry Pi 3 Model B+ has a 1400 MHz BCM2710 ARMv8 Cortex-A53 quad-core CPU and has improved power management and networking components.
The Raspberry Pi Zero 2 W has the same form factor as the Raspberry Pi Zero W, with a 1000 MHz BCM2710 ARMv8 Cortex-A53 quad core CPU and 512 MB of RAM along with on-board Bluetooth and WiFi radios.
All Raspberry Pi 3 models use the same AArch64 toolchain and ARMv8 kernels, but different device trees.
The Raspberry Pi 4 Model B has a 1500 MHz BCM2711 ARMv8 Cortex-A72 quad-core CPU and is available with 1 to 8 GB of RAM. It diverged significantly from the Raspberry Pi 1 B+ form factor, with the USB and Ethernet ports reversed, two micro-HDMI connectors instead of a single full size HDMI connector, and a USB-C power connector instead of micro-USB. Two of the USB ports are 3.0 and two are 2.0. A major improvement is a Gigabit Ethernet controller connected via PCI Express instead of the USB connected Ethernet used for all earlier models. The Raspberry Pi 4 Model B uses the same wireless chip set as the 3+.
There are also a myriad of Raspberry Pi 4 Compute Modules, with varying combinations of wireless Ethernet, RAM and eMMC.
All Raspberry Pi 4 models use the same AArch64 toolchain and ARMv8 kernels, but different device trees.
The Raspberry Pi 5 yields another 2-3x increase in performance over the Raspberry Pi 4, at the expense of greater power consumption. It has a 2400 MHz BCM2712 ARMv8 Cortex-A76 quad-core CPU and is available with 4 or 8 GB of RAM. The Ethernet socket and USB ports have swapped sides, so it has a form factor that is sort of a cross between the Raspberry Pi 1 B+ (same grouping of Ethernet and USB ports) and the Raspberry Pi 4 (same dual micro-HDMI sockets and USB-C power socket). It uses the same AArch64 toolchain as all of the other 64-bit Raspberry Pi models, but a separate kernel and device tree.
The Raspberry Pi 5 introduced a breaking GPIO API change. See Application Note #11 for more information.
The Raspberry Pi 5 also introduced a breaking PWM API change. It has four hardware PWM outputs, but the pin mapping has changed as well. Notably, channel 2 is mapped to GPIO18 instead of channel 0 on previous Raspberry Pi boards. See RP1 Peripherals page 15 for more information.
MuntsOS also provides Raspberry Pi kernels with dedicated USB
Gadget support enabled. These kernels
run on 3 A+, CM3, Zero 2 W, 4 B, and CM4. You can supply power to and
communicate with a compatible Raspberry Pi solely through the USB port.
This kernel supports USB Network, Raw HID, and Serial Port gadgets,
selected by bits in the OPTIONS
word passed on the kernel command
line. The USB Gadget Thin Servers have USB Network Gadget selected by
default.
The absolute minimum possible usable Raspberry Pi kit consists of a Raspberry Pi Zero 2 W, a micro-USB cable, and a micro-SD card with one of the MuntsOS Raspberry Pi 3 USB Gadget Thin Servers installed.
I build a custom Ada/C/C++/Fortran/Go/Modula-2 GCC cross-toolchain for each MuntsOS platform family. Each GCC cross-toolchain requires a number of additional software component libraries, which are packaged and distributed separately but installed into the same directory tree as the parent cross-toolchain. I also build Free Pascal cross-compilers. Each of these rely on the libraries contained in the corresponding GCC cross-toolchain package.
Cross-toolchain packages built for Debian Linux (x86-64 and ARM64) development host computers are available at either:
http://repo.munts.com/debian12 (Debian package repository) or http://repo.munts.com/muntsos/toolchain-debs (just the package files).
x86-64 RPM packages containing the exact same binaries and known to work on Fedora 40 and RHEL 9.1 and its derivatives are available at:
http://repo.munts.com/muntsos/toolchain-rpms
Prebuilt cross-toolchain packages for Debian Linux are available at:
http://repo.munts.com/debian12
Prebuilt binaries for MuntsOS are available at:
The source code for MuntsOS is available at:
https://github.com/pmunts/muntsos
Use the following command to clone it:
git clone https://github.com/pmunts/muntsos.git
Questions or comments to Philip Munts [email protected]