Experimental add-on packages for official Chrome OS builds

This is highly experimental! If you have trouble, please contact tv@duh.org.

These packages will allow you to add extra software to your Chrome OS device without installing a non-official (developer) build (though the packages work with other third-party builds too). To do this, the packages are built to install into /usr/local, and the instructions below make that directory writable. By using /usr/local, the root partition can be left as read-only, allowing official build updates to install normally.

I'm going to post more packages soon, but for now some of the most-requested ones are here. If you try this process, please let me know your success/failure, or any other feedback you might have about the process.

If you want all of the software below bundled into a full system image build, you may want to check out my open source builds of Chromium OS for the Cr-48.


Before installing any packages, you need to have a writable /usr/local directory. NOTE: If you're already running a non-official (developer) build, skip this part and go right to Extracting Packages, below.

Your device must first be set to developer mode before you will be able to install these packages, of course (since developer mode is required in order to get a plain Linux shell prompt).

  1. Open a shell and run:
     sudo mkdir /mnt/stateful_partition/dev_image
    This will create a new directory in the stateful partition that represents the (modifiable!) /usr/local area. The name "dev_image" is semi-magic -- this is the same name that non-official (developer) builds use to represent /usr/local. You can actually pick any name, even "local", but the instructions here assume "dev_image".
  2. Mount /usr/local by hand with the following commands:
     sudo mount -n --bind /mnt/stateful_partition/dev_image /usr/local
     sudo mount -n -o remount,exec,suid /usr/local
  3. At this point, you should be able to verify that /usr/local is mounted by:
     mount | grep local
    which should show:
     /dev/sda1 on /usr/local type ext3 (rw,nodev,relatime,errors=continue,commit=600,data=ordered)
    In particular, the mount should not show the flags noexec or nosuid.
  4. If you're using any package that has a "requires: ..." note below, you need one more command to ensure the extra libraries are picked up at runtime. To do this, also run:
     export LD_LIBRARY_PATH=/usr/local/lib
  5. The steps above have to be performed on every boot, but to save hassle, edit ~/.bashrc and add the following lines to the bottom to mount it as soon as any shell is invoked (vt2 or via Ctrl-Alt-T plus "shell" command):
     if ! grep -q /usr/local /etc/mtab; then
         sudo mount -n --bind /mnt/stateful_partition/dev_image /usr/local
         sudo mount -n -o remount,exec,suid /usr/local
         export LD_LIBRARY_PATH=/usr/local/lib
    Note that if the chronos user has a password, you will be prompted for it the first time you get a shell on each boot, because of the sudo commands. (On vt2, you'll get a Password prompt twice -- once to login, and once for the sudo mount commands above.)

Extracting Packages

Now that you have a writable /usr/local, you can extract some of these packages. Assuming you downloaded them with the regular browser, they're located in ~/Downloads. So do the following for each package you want to install:

 cd ~/Downloads
 sudo tar --wildcards -C / -xvjf PACKAGENAME.tbz2 './usr/local/*'

The reason for --wildcards and the strange looking './usr/local/*' is to make tar only extract the parts that reside under /usr/local. (The packages contain residual files that try to install outside that area, but those are safely ignorable.) At the end of the process, you may see an error like the following, which is normal and can be ignored:

 bzip2: (stdin): trailing garbage after EOF ignored

If all went well, your new programs should be located in /usr/local/bin and be runnable immediately.

Icon  Name                       Last modified      Size  Description
[PARENTDIR] Parent Directory - [TXT] HEADER.html 2011-02-24 08:41 5.6K [TXT] README.html 2011-01-31 14:34 15 [   ] doomsday-1.9.0_beta62.tbz2 2011-02-15 15:06 5.8M [requires: libsdl,sdl-mixer,sdl-net] DOOM game engine clone [   ] libsdl-1.2.13-r1.tbz2 2011-02-15 14:26 1.1M [   ] lynx-2.8.7_p1.tbz2 2011-02-15 13:57 1.9M text-based Web browser [   ] mc- 2011-02-15 13:44 1.2M visual file manager with text and X11 interfaces [   ] nano-2.2.5.tbz2 2011-02-12 15:40 341K text editor similar to Pine's pico [   ] p7zip-4.58.tbz2 2011-02-12 15:36 7.8M archiver for .7z files [   ] popt-1.15.tbz2 2011-02-12 15:34 113K [   ] rdesktop-1.6.0-r5.tbz2 2011-02-15 12:46 396K Windows Remote Desktop client [   ] rsync-3.0.6.tbz2 2011-02-12 15:38 583K [requires: popt] rsync client [   ] sdl-mixer-1.2.11.tbz2 2011-02-15 14:41 127K [   ] sdl-net-1.2.7.tbz2 2011-02-15 14:41 53K [   ] socat- 2011-02-15 10:02 846K TCP/UDP Swiss-army knife [   ] tigervnc-1.0.1.tbz2 2011-02-15 10:20 831K VNC client [   ] unrar-3.8.5.tbz2 2011-02-16 18:17 396K extractor for .rar archives [   ] unzip-6.0-r1.tbz2 2011-02-12 15:45 375K extractor for .zip archives [   ] vile-9.4d.tbz2 2011-02-15 15:35 2.0M text editor (clone of classic vi) [   ] zip-3.0.tbz2 2011-02-12 15:49 533K creator of .zip archives