2014-12-31
Using Inferno OS on Linux
It's the end of the year and I'm going through some of the patches I have for projects and putting them online so I have a record of them. I'm working through things I did on Inferno OS.
Source respositories
The official Inferno source is hosted in a mercurial repository on Google Code. There is also a repository containing a snapshot of this with changes to get Inferno building on Android systems on bitbucket. Finally there is a tarball containing a snapshot which includes fonts required by Inferno that are not stored in the mercurial repository.
I carry a couple of custom patches to Inferno and I also have changes to the Android port that I keep in a patch file. When working on these I find it useful to be able to diff between the current Inferno source and the Hellaphone source to see what changes were made.
I've cleaned these up and put the patches in a github repository with a conversion of the mercurial repositories to git. The Hellaphone code is a branch of the repository makeing it easy to cherry pick and diff between that and the main source. I've put this in github.com/doublec/inferno.
There are four main branches in that repository:
20100120
- Snapshot with the additional fontshellaphone
- Hellaphone Android portinferno
- Direct import of the Inferno mercurial repositorymaster
- Everything needed for building inferno on Linux. It is a recent working version of theinferno
branch with the additional fonts from the `20100120` branch and any additional work in progress patches to work around existing issues.
I use master
for running Inferno on desktop and hellaphone
for phone development. The README on master explains how to build and the README on hellaphone has the steps to get it running on a phone.
Building on Linux
Building Inferno on Linux with the official source involves downloading an archive containing a snapshot of the source with the addition of some font files that are licensed differently. You then do a mercurial update to get the latest source code. Something like the following performs the build:
$ wget http://www.vitanuova.com/dist/4e/inferno-20100120.tgz
$ tar xvf inferno-20100120.tgz
$ cd inferno
$ hg pull -u
$ ...edit mkconfig so entries are set below...
ROOT=/path/to/inferno
SYSHOST=Linux
OBJTYPE=386
$ export PATH=$PATH:`pwd`/Linux/386/bin
$ ./makemk.sh
$ mk nuke
$ mk install
Building using my github repository requires:
$ git clone https://github.com/doublec/inferno
$ cd inferno
$ sh Mkdirs
$ .. edit `mkconfig` to so the following entries are set to these values...
ROOT=/root/of/the/inferno/git/clone
SYSHOST=Linux
OBJTYPE=386
$ export PATH=$PATH:`pwd`/Linux/386/bin
$ ./makemk.sh
$ mk nuke
$ mk install
Running Inferno
I use a shell script to run Inferno. The contents look like:
export PATH=$PATH:~/inferno/Linux/386/bin
export EMU="-r/home/$USER/inferno -c1 -g1920x1008"
exec emu $* /dis/sh.dis -a -c "wm/wm wm/logon -u $USER"
This starts Inferno using the same username as on the Linux system and with the desktop size set to 1920x1008. The JIT is enabled (the -c1
flag does this). For this to work I need to have a /usr/chris
directory in the Inferno file system with some default files. This can be created by copying the existing /usr/inferno
directory:
$ cd inferno
$ cp -r usr/inferno usr/chris
The patches in my master
branch add a -F
command line switch to the emu
command to use full screen in X11. This is useful when using a window manager that doesn't allow switching to and from full screen. On Ubuntu I often run Inferno full screen in a workspace that I can switch back and forth to get between Linux and Inferno. This can be run with the above shell script (assuming it is named inferno
and on the path):
$ inferno -F
Accessing the host filesystem and commands
Often I want to access the host filesystem from within Inferno. This can be done using bind
with a special path syntax to represent the host system. I like to keep the path on Inferno the same as the path on Linux so when running host commands the paths in error messages match up. This makes it easier to click on error messages and load the file in Inferno text editors. I map /home
as follows (';' represents an Inferno shell prompt):
; mkdir /home
; bind '#U*/home' /home
Now all the directories and files under /home
in Linux are available under /home
in Inferno.
The Inferno os
command is used to run host programs from within Inferno. To run git
for example:
; os -d /home/username/inferno git status
...output of git...
Note that I had to pass the -d
switch and to give the path on the host filesystem that will be the current working directory for the command. I can even do Firefox builds from within Inferno:
; cd /home/username/firefox
; os -d /home/username/firefox ./mach build
...firefox building...
Any errors in source files that appear can be shown in the Inferno acme editor as I've mapped /home
to be the same on Inferno as on the host.
VNC in Inferno
Sometimes I need to run graphical host commands from within Inferno. Mechiel Lukkien has a large number of useful Inferno programs written in Limbo. One of these is a vnc client. From a source clone of this project it can be installed in Inferno with something like:
; cd vnc
; SYSROOT=Inferno
; ROOT=
; mk install
Start a VNC server from the Linux side:
$ vncpasswd
...set password...
$ vncserver :1
Connect to it from the Inferno side:
; vncv tcp!127.0.0.1!5901
Now you can run Firefox and other useful programs from within Inferno. Inferno has its own web browser, Charon, but it's nice to be able to use a full browser, terminals, etc to do Linux things from within Inferno when needed. vncv
isn't feature complete - it doesn't do modifier keys unfortunately, but is still a useful tool.
Mechiel Lukkien has many other useful libraries worth exploring. There is an ssh
implementation, a mercurial client, and an interesting 'irc filesystem' which I've written about before.
Other tips
Acme is one of the editors available in Inferno. It's also available on other operating systems and Russ Cox has a Tour of Acme video which explains its features. Most of these work in the Inferno port too.
Pete Elmore has an introduction to the Inferno shell and other Inferno posts. The shell has a way of passing data from one shell command to another. For example, du
can recursively list all files in the current directory and subdirectories:
; du -an
To pass this list to grep
to find the text 'ASSERT' within these files:
; grep -n ASSERT `{du -an}
filename.h:100: ASSERT(1)
Limbo
Limbo is the programming language used in Inferno. It is a typed programming language with support for concurrency using channels and lightweight threads. The book Inferno Programming with Limbo is available as a PDF and also makes for a good introduction to Inferno itself. The line between Inferno as an OS and Inferno as a language runtime is a bit blurry at times.
Why Inferno?
Inferno has some interesting ideas with regards to distributing computing power and provides a way to explore some ideas that were in the Plan 9 OS but useable on multple platforms. My post on sharing computer and phone resources gives some examples of ways it could be used. Its lightweight threads and concurrency make for useful programming system for server based tasks.
Inferno is a small hackable OS for learning about operating systems. For more on this the book Principles of Operating Systems by Brian Stuart covers Inferno and Linux. One aspect I was interested in exploring was porting parts of the OS from C to the ATS programming language in a similar manner to what I describe in my preventing heartbleed bugs with safer programming languages post.
More on Inferno is available at: