Hacking on NodeOS

Building a operating system, even a simple one, is no small feat. For starters, you will have to be familiar with programming in Assembly or a low level language like C/C++. In addition to possessing technical know-how of your chosen language, a lot of thought would have to go into its design:

  • does it have a GUI, a command line, or both?
  • what processor architecture will be designed for? 32-bit or 64-bit?
  • build from scratch or use an existing kernel?
  • use an existing boot loader or roll your own?
  • which API to implement for easier porting of applications from other OSes?
  • go with a monolithic or microkernel?
  • and so on ...

Given the high barrier of entry, it doesn't come as a surprise that not just every programmer out there wants to build an OS - at least not in the conventional sense. Not unless, of course, you have the right tools to make OS development much easier - tools like docker. In fact, the project author Jacob Groundwater did just that when he started working on NodeOS.

For now, NodeOS seems more of an experimental idea which presents a custom shell - nsh - on top of the Linux kernel. However, the project has ambitious goals - with the author intent on getting it to work on hardware, hypervisors (VirtualBox, VMWare), as well as on cloud providers like Joyent and Amazon.

System Structure

NodeOS can be broken down into layers, making development much easier. There are 5 layers at this point in time, and they are all managed by docker:

  • Layer-0: boot loader and kernel, provided by Docker
  • Layer-1: Linux shared libraries
  • Layer-2: Node.js binary
  • Layer-3: core NodeOS - init daemon and package manager
  • Layer-4: customizing distributions by adding userland modules

Want to add changes to the NodeOS core? Add code to Layer 3. Feel the need to customize the NodeOS distribution by packaging userland modules? Add them to layer 4.

Getting Started

To get started with NodeOS, you need docker and nodejs installed on your machine. I recommend spinning up a virtual machine with Ubuntu Precise 12.04 (LTS) (64-bit) as your operating system of choice.

Install Docker

If you don't already have docker, use this curl script to automate your installation.

  1. curl -s https://get.docker.io/ubuntu/ | sudo sh

Install NodeJS

Use the nodejs apt repository to get your installation up and running:

  1. apt-get install python-software-properties
  2. add-apt-repository ppa:chris-lea/node.js
  3. apt-get update
  4. apt-get install nodejs

Run the Demo!

Loading the default NodeOS demo is as easy as running a single docker command:

  1. sudo docker run -i -t nodeos/nodeos

Once the container loads, you're introduced to the nsh shell. Go ahead and try some basic commands like ls, cat and pwd. NodeOS provides implementations for these commands via layers 3 and 4:

  1. / # ls
  2. [ 'etc', 'lib', 'lib64', 'root', 'bin', 'sys', 'usr', 'share', 'proc' ]
  3.  
  4. / # cd etc
  5. /etc # pwd
  6. /etc
  7.  
  8. /etc # ifconfig
  9. { lo: { address: '127.0.0.1' },
  10. eth0: { address: '172.17.0.2' } }

Install Packages

NodeOS uses npm as its package manager, albeit under the alias of npkg. Use npkg to install packages as you would with npm. Bear in mind that npkg connects to a different registry as opposed to npm.

To use curl for example, first install the bin-ncurl package:

  1. / # npkg install bin-ncurl
  2. npm http GET http://linux-x86.node-os.com/ncurl
  3. npm http 200 http://linux-x86.node-os.com/ncurl
  4. npm http GET http://registry.npmjs.org/ncurl/-/ncurl-0.1.0.tgz
  5. npm http 200 http://registry.npmjs.org/ncurl/-/ncurl-0.1.0.tgz
  6. /root/bin/ncurl -> /root/lib/node_modules/ncurl/bin/ncurl
  7. ncurl@0.1.0 /root/lib/node_modules/ncurl

Next, use ncurl from the commandline:

  1. / # ncurl google.com

Exiting the shell is as easy as pressing Ctrl + D:

  1. / # ^D

Setting up Express on NodeOS

Now let's see just how fast we can roll out a common Node.js application - an embedded RESTful webserver.

Install express via npkg:

  1. / # npkg install express
  2. npm http GET http://linux-x86.node-os.com/express
  3. npm http 200 http://linux-x86.node-os.com/express
  4. ...
  5. <code>
  6.  
  7. Now create a project directory and bootstrap it with express:
  8.  
  9. <code>
  10. / # mkdir opt
  11. / # cd opt
  12. /opt # mkdir blog
  13. /opt # cd blog
  14. /opt/blog # express .

Don't forget to install package dependencies locally using npm:

  1. /opt/blog $ npm install -d

Finally, run the server and viola - simple wasn't it?

  1. /opt/blog $ node app.js
  2.  
  3. Express server listening on port 3000

Caveats

NodeOS is far from being a full-fledged operating system. However, despite its infancy, functional NodeOS images can be generated because of docker.

Though still a work in progress, there's a lot more in store for NodeOS. A couple of things missing right now are:

  • management of system users and groups
  • a viable service manager
  • a graphical user interface

As it's an open-source project, you're more than welcome to contribute to its advancement - so get started by forking NodeOS at https://github.com/NodeOS/NodeOS-Docker.

There are additional NodeOS repositories as well, for different parts of the OS:

I don't know about you, but I can barely wait to see what the future holds for NodeOS! To stay updated with what's going on with NodeOS, check out the official blog

Raj Kissu's picture

Add new comment

By submitting this form, you accept the Mollom privacy policy.