Monday, June 07, 2010

N900 Easy Debian, After PR 1.2

Executive Summary: There's a new version of Easy Debian in Extras-testing that has a much better method for getting the keyboard working in LXDE after the PR 1.2 firmware update changed things.

The recent PR 1.2 firmware update fixed many bugs and added many features, but it also "broke" a trick that Easy Debian folks had been using to get keyboard focus back after returning to LXDE from another app.

A little background: Maemo 5's window manager, Matchbox 2, is very strict about the keyboard focus rules, far, far stricter than any other window managers. They did this for power management reasons. Some people have called this a bug, but others argue that this is the most correct way to do it, and it is the fault of sloppy applications.

Whoever is to blame, there are quite a few apps out there that don't work properly with the N900's window manager. Unfortunately, the Xephyr nested X server that Easy Debian uses to run LXDE inside Maemo is one of those apps. Finding a way to get keyboard focus for Xephyr was one of the first hurdles facing the Easy Debian project when porting to Maemo 5.

The original breakthrough happened when qobi wrote a little "fixer app" that "fixed" non-compliant windows when given a window ID as a parameter. This method gave initial keyboard focus to LXDE when starting up.

Someone discovered a much more elegant workaround, however. All you needed to do was press the power button and then clear the menu by pressing the screen outside the menu, and the current window would receive keyboard focus. This became the standard method for returning to Easy Debian's LXDE after using another app, such as receiving a phone call or taking a picture.

When the long-anticipated PR 1.2 firmware update came, Easy Debian users were dismayed to discover that they couldn't use the power button to get their keyboard back in LXDE. Even worse, that trick made it impossible for the user to hit Ctrl-backspace to get back to the dashboard. The only ways to "break out" of this keyboardless LXDE were to either log out or to open the camera. Not a good situation.

After some hacking, we have managed to get things working again. It isn't as neat as the power button workaround, but it is nearly as good. Now, the same LXDE icon that opens LXDE in the first place also returns you to LXDE with keyboard focus. So you only need to put the Easy Debian LXDE icon (the red diamond with the "d" in it) on your desktop and press it whenever you want Easy Debian LXDE.

If you want this new version (and if you use Easy Debian LXDE, and you have PR 1.2, then yes, you want it), enable the Extras-testing repository and get the update. Please be aware that any other apps that offer updates after you enable Extras-testing may not be ready to be installed, since they may not comply with the community's QA standards.

If you have any questions about Easy Debian, they're probably answered in the the Easy Debian wiki page, but if not, go to the talk thread and ask your question there.

Labels: , , , , , , ,

Friday, March 27, 2009

Easy Chroot for Maemo

I'm going to start this post with a defence of my pronunciation of "chroot" as a single word, not "c-h-root" or whatever. I believe it should be pronounced this way for three reasons:
  1. Unix/Linux commands and computer acronyms are commonly pronounced as words. "grep", which is a contraction of the g/re/p command, is pronounced as a word, as are many even less plausible acronyms. Try saying "s-c-s-i" instead of "scuzzy" in a computer lab and be prepared for the derisive laughter.
  2. I think the chroot command was intended to reference the cheroot, a kind of inexpensive cigar also known as a stogie.
  3. It is much easier to say. Why would you make work for yourself by saying a one-syllable word as two or three syllables?
The rest of this post is a more in-depth technical discussion of my easy-chroot package, targeted at developers, those wishing to easily mount partitions and image files, and those wishing to try out new linux distributions and environments with a minimum of hassle (no rebooting, partitioning, etc).


Easy Chroot: Introduction

I have packaged the scripts for the mount-and-chroot system underlying my Easy Debian package into a separate package I call "Easy Chroot". I have also included the drivers (compiled by Matan for me) to do the "turbo loop," which allows a mounted image file to be accessed at nearly the same speed as a partition.

I have created (with lots of help from lots of people) a set of scripts that are very generic, and can be used independently or together to build and run various kinds of "appliances" or OS replacements, without any direct impact on the host OS.

The Scripts

qchroot:

This is the all-in-one core script.

Provide it with an image/partition, a mount point, and a command, and it will do the rest... (But it runs the commands it is given as root inside the chroot, which is often not what you want. See the quserchroot command, below, to run chroot apps as non-root.)

The first parameter is the image file, the second parameter is the mountpoint, and the rest of the parameters are passed to the chroot and run there. There's a lot of magic going on under the surface here, so let's look at what's going on "under the hood."

The qchroot script can be broken into three parts; mount, bind, chroot. The mount portion is handled by qmount below, so we'll look at the binding and chroot portions.
  • Binding: After a partition or image file is mounted, it isn't very useful for the kind of chroot we want here. A basic chroot is sometimes referred to as a "jail", because applications run in the chroot filesystem can't "see" anything outside of this filesystem. This means none of the devices, media, temp directories, nor even the user's home directory can be accessed while "inside" the chroot. That's why a careful use of the "mount -o bind" command is required. It mounts directories from the parent OS in the chroot, too, so applications in the "chroot" can "see" them. Mounting the /dev directory makes most of the devices connected to the system visible, and mounting everything under /media allows the chroot access to SD cards and attached external media such as USB drives. This also allows chroot apps to share the X display and desktop manager, so they appear to be running on the Maemo desktop. The qchroot script also mounts the various temporary directories, so that applications can communicate with applications in the parent OS. This means GTK apps inside the chroot can invoke Maemo's stylus keyboard when a text field is tapped. It also means a chroot app can open an e-mail attachment from Modest.
  • Chroot: This is the primary purpose of all of these scripts, and in the end, it is one of the most simple and straightforward parts. The qchroot script makes sure that exiting the chroot, however that happens, resets things gracefully as possible, but the actual chroot is a simple one line command. It really is the mounting and the binding that make the chroot a workable virtual environment.
userchroot: The userchroot script is only a thin wrapper around qchroot. This script, however, isn't run as root; in fact it will fail unless it is run as non-root. The userchroot script inserts an extra "su user -c" before the commands to be executed inside the chroot. It takes the same parameters as qchroot.

For example, let's say you have an image file on your SD card containing, among other things, OpenOffice.org. You would run the following command (as user, not root) to open a document in oo writer:
userchroot /media/mmc1/ubuntu-ooo.img.ext2 /opt oowriter "/home/user/MyDocs/resume.doc"
Hey! Look at that splash screen! You're starting up OpenOffice Writer!

qmount: This script does some serious heavy lifting. It is called by qchroot to mount the image file or partition. It takes the first two parameters of the scripts mentioned above; the image/partition name and the mountpoint. A lot of my best scripting is in here, and this is also where I needed the most help from outside.

The qmount script checks to see what it is you are trying to mount, and if you are mounting an image file (a file that contains a filesystem, like an ISO file, except it is read/write), it will use the dmlosetup app (thanks Matan!) to mount the image file; this improves read/write speed dramatically, and makes the image file almost as fast as a dedicated partition.

You can use this script to mount an image or partition, if all you want to do is mount it (and not chroot into it). A partition mounted with qmount is not suitable for chroot however.

closechroot: This script is one of the best things about running applications in a chroot. By running this script, you can kill all of the chroot applications in one blow. No hunting around trying to find stray processes. The closechroot script is also very important to run if you want to delete or move the image file that you have mounted, because the dm-loop doesn't "let go" of the image file when you just unmount it.

The closechroot script takes one parameter, the directory where the chroot is mounted. It then kills the chroot applications, unmounts all of the bound directories, and then unmounts the image file or partition that you mounted.

qumount: This is the script that does the unmounting for closechroot. It can be used independently if all you want to do is unmount a partition or image file. Don't use qumount to unmount a fully mounted chroot, however.

synchroot: This script doesn't need to be run very often. It copies several configuration files from the primary system to the chroot, so that the two environments are "synched". This is important for things like time, user permissions, keyboard mapping, and networking. The files that are copied are the following:
  • /etc/hosts
  • /etc/resolv.conf
  • /etc/group
  • /etc/passwd
  • /etc/localtime
  • /usr/share/X11/xkb
The files in the chroot are backed up with a date-based extension, so you can restore your chroot file system if synchroot breaks something.

Some Support Hacks

There are a few extras thrown into the easy-chroot package to make it easier to run non-hildon applications. Here's a quick overview of them.

Movable Dialogs Hack
: Thanks to qwerty12 and Matan, you can set your dialogue boxes to be either movable or static (the default). Movable dialogues are often needed when running desktop applications which can have huge dialogue boxes for settings, etc.

Processor Speed Hack: Thanks to lcuk and others, the /sbin/cpu-ondemand and /sbin/cpu-perform scripts (and associated menu items) set your processor to either "on demand" mode (processor speed drops when cpu is idle) or "performance" mode (processor speed is locked at full speed). Due to very aggressive definitions of "idle" in the Maemo system, the processor often scales back to half speed when it isn't appropriate. This can have a noticeably negative impact on processor intensive applications (like Gimp and OpenOffice, etc). By setting the processor to "performance", you can dramatically speed up many of these big, slow applications.

Host Window Hack: Thanks to Bundyo, this little app (/usr/bin/hostwin) can be used with the Xephyr nested X-server to run a secondary desktop (yes, a complete desktop, like Gnome, or KDE, or anything) as a window on your primary Maemo desktop. See the link above to the ITT thread discussing the program's use.

Installing The Package

easy-chroot can be found in the diablo extras repository. Install with the Application Manager or apt-get install easy-chroot or make it a dependency of your project.

Labels: , , , , , , ,

Sunday, October 12, 2008

Easy Debian moves to Extras

Finally, "Easy Debian" is no longer just a "circus trick"; you can use real laptop applications on your tablet at not-unreasonable speeds, thanks to a couple of "turbo charging" boosts we've gotten lately, and a lot of polish from the rapidly maturing Debian side.

I was overwhelmed by the huge positive reaction across the Internet when I released the first version of my Easy Debian project back in July on Internet Tablet Talk. But I was frustrated by the speed of the "image file" method I was using, and the Debian "armel" architecture was still missing a few key pieces to make it a stable, trustworthy distribution.

Several things have changed since July. First, the Debian armel architecture managed to pull things together in time for the Lenny "freeze" at the end of July. That means there will be a tablet-compatible version of Debian when Lenny becomes the next "stable" version later this year. It also means things like Java, OpenOffice.org and Firefox got some seriously good polishing in the last few months, and it really shows when you run them on the tablet. Also, the LXDE desktop environment came to my attention. It is a really nice, light environment that runs fast on the tablet, and is much more full-featured than the IceWM window manager I was using before.

Secondly, I was given the exciting privilege of Nokia sponsorship to the Maemo Summit in Berlin in September. This motivated me to prepare a new Debian file system with all of the enhancements that had been added in the previous months, as well as some tricks that I had learned since the first version.

Lastly, through the help of others, I found two really effective speed-up techniques that suddenly made the Easy Debian apps really usable! I got down on my virtual knees on the #maemo IRC channel and begged the elite tablet hackers there to help me figure out how to speed up access to the image file that was the basis of the Easy Debian project. Matan came through in a big way; he presented me with some kernel modules and some instructions that accelerated the whole project to almost the same speed as using a dedicated partition (around 2x-4x faster)! I then discovered the ability to set the tablets' processor to "Performance Mode," thanks to lcuk's liqbase project. What a difference that made for processor-hungry apps like OpenOffice and Iceweasel (Firefox)!

So, now that all these pieces are in place, and now that the whole project has "grown up," I felt I needed to push it into the official repositories. I was also getting some gentle pushes from several community members.

Even though the entire project is made from free components (except for one notable exception in the image file), I have released it to the non-free section of Extras-Devel. This is because it was too difficult to get all of the contributed binary bits into a form that could be compiled by the autobuilder that guards the gates of the "free" repository.

Screenshots: (click picture to see more info and larger sizes)

The Gimp editing a 4 megapixel digital photo:




OpenOffice Writer editing a document in OS2008, with Matchbox-Keyboard on top:



LXDE, (the Lightweight X Desktop Environment) running on top of OS2008:

Labels: , , , , , ,