Installing Ubuntu On An Asus Eee 901 PC

Unity Desktop I have an Asus Eee PC that had the old Ubuntu Easy Peasy Eee remix on it (I think it was based on 8.04 LTS release). Anyway the software on it was ancient and rather than throw it out I thought I’d install Ubuntu 14.04 LTS and try running the Unity desktop on it.

So what? You may ask. The model of Eee PC that I have is the 901. For those that don’t know; it comes with two SSDs, one fast 4GiB device (that is supposed to hold the operating system) and a slower 16GiB device for user data. See the problem? Yes 4GiB is very small for a modern OS and you don’t really want it running on the slower, larger device.

Well I succeeded and I am writing this blog post on the newly set up Asus Eee PC.

Normally I have no time for the more restrictive desktops like Unity and Gnome 3, preferring the so-called productivity desktops such as Gnome 2 or KDE. However, on such a small netbook the one thing on the screen at a time approach is much more useful. I chose to stick with Ubuntu as they had originally supported the device when it first came out and so Unity seemed a logical choice of desktop.

Please note:

  1. The instructions below assume that you have root privileges on the command line. Rather than waste time by preceding each command with a sudo statement, simply switch to the root user by doing:

      sudo su -

    and then issue what ever commands you need and then type exit when you are done.

  2. Make sure that you back up any important data before attempting anything. Although I have done my best to sanitise and check what I have said in this post, I will not be held responsible for any damage done as a result of following its advice.
  3. This post assumes that the reader is either familiar with Linux and its command line or a very brave new comer!


I used an external USB DVD drive and a DVD with a copy of Ubuntu 14.04 Server LTS edition on it. I chose LTS because I want stability and long-term support, but the choice of server was down to the lack of space.

The trouble is when you install a desktop edition it will check to see that you have enough space for the OS, the desktop and the space to download the packages before they are unpacked and installed. The latter space requirement is only temporary since after a package is installed the related .deb file is no longer needed.

Therefore by installing the server edition of Ubuntu I can install the base operating system, without any desktop, clean up the installation packages, make temporary space available for installing the desktop and then complete the installation.

Installing The Base System

I tend to use the advanced text mode in installers and this was no exception.

I set up the disks to have a single partition on each device with an ext2 file system on each for / and /home, with / being on the fast 4GiB device. I chose ext2 as this was the simplest way of not having a journaling file system, always a bad idea on older SSD devices as it increases the amount of writing that goes on. I also didn’t set up a swap partition, choosing to dedicate the entire SSD storage to the two file systems.

I then installed Ubuntu Server only selecting the ssh server option (personal choice).

Once installed, I did a system update and updated the kernel using apt:

    apt-get update
    apt-get upgrade
    apt-get dist-upgrade

I then rebooted and removed the old kernel by doing something like:

    dpkg-query -W | grep ^linux
    dpkg-query -W | grep ^linux | grep 3.13.0-32
    apt-get purge linux-headers-3.13.0-32 linux-headers-3.13.0-32-generic linux-image-3.13.0-32-generic linux-image-extra-3.13.0-32-generic
    apt-get clean

Installing The Unity Desktop

At this point I now had an up to date minimal installation of Ubuntu and something that I could control. However Apt would not allow me to install Unity due to a lack of disk space. Remember that whilst you obviously need space for the software you’re about to install, you also need space for the downloaded packages, well until you have finished installing them at least.

As you probably know, Apt stores downloaded packages in its cache area under /var/cache/apt/archives. Thus I decided to temporarily move this area to the larger, but slower, SSD device during the installation process. The simplest way of doing this, since there are specific directory structures and files in place under /var/cache, was to use a union file system.

A union file system is one that can be used to join separate directory structures together in one file system. One common use of this technology is to implement a copy on write file system on top of a read-only one. In fact later on I use a union file system in a well-known technique to reduce writes to the / partition. However here I used it to simply redirect changes to /var/cache onto the second SSD. The union file system of choice in Ubuntu is aufs.

So I installed Unity by doing:

    mkdir -p /home/cache
    mount -t aufs -o dirs=/home/cache=rw:/var/cache=ro none /var/cache
    apt-get install ubuntu-desktop
    apt-get clean
    umount /var/cache
    rm -rf /home/cache

Please note that there is no special reason as to why I did the mounting at the higher level of /var/cache other than it was less stuff to type, it’s no less efficient and does the job.

Reducing The Size Of The Installation

One can install lighter weight desktops like Xfce if you wish or a minimal Unity desktop. By installing the server edition you have control over what desktop packages you install. For example, one way to install a cut down Unity desktop would be to use the following Apt command:

    apt-get install --no-install-recommends ubuntu-desktop

Another alternative would be to remove any unwanted packages after installing Unity. One can find out which packages are consuming the most space by doing:

    dpkg-query -Wf '${Installed-Size}\t${Package}\n' | sort -n

Do be careful about what you remove though! Also remember to use the apt-get purge command and not the apt-get remove command so as to remove configuration files as well.

I however wanted most if not all of the applications that were installed. In addition I wanted to install a few extra pieces of software. Therefore I needed to relocate some files over to the other SSD under /home. So I used the tar command to bundle up a number of directories and relocated them under /home/system and then used symbolic links to link across from the original locations to their new ones.

Basically when all your software is installed you will need at least 400MiB of free disk space under / for software updates, in particular kernel updates can temporarily take up about 300MiB during this process.

Relocating Files To Make Space

If you don’t have 400MiB of free space under / then you will need to relocate some files to the second SSD. These are the directory trees that I moved:


What is important about these directories is that they contain large amounts of data but are not accessed when running everyday applications. Ok perhaps help files don’t strictly fall into this category but they’re only accessed when you call upon application help, which isn’t going to be that often.

I decided to keep things neat and tidy and put all the relocated files from the 4GiB SSD to /home/system. So for example, I relocated the src directory by doing:

    mkdir -p /home/system/usr/src
    chmod 755 /home/system
    chmod 755 /home/system/usr
    chmod 755 /home/system/usr/src
    cd /usr/src
    tar cvzf /home/system/trans.tgz .
    cd ..
    rm -rf src
    ln -s /home/system/usr/src
    cd /home/system/usr/src
    tar xvpzf /home/system/trans.tgz
    rm /home/system/trans.tgz

Setting Up Swap Space

Remember above I said not to create a swap partition? Ok well it’s still a very good idea to have some swap space, especially on a netbook with only 1GiB of memory. Not doing so will mean you won’t have any overflow or tolerance when your RAM is exhausted due to some memory intensive application.

Therefore we need to set up a swap file rather than a partition. This has the advantage of flexibility as we can put it where we want and easily resize it if need be (by replacing it in effect). The downside is that swap files are generally considered slower than swap partitions, but when you consider how slow disks are compared to memory then using swap will be slow regardless of what you’re using as the underlying storage.

I created the swap file as follows (this assumes that you have already created the /home/system directory mentioned above):

    cd /home/system
    dd if=/dev/zero of=swap bs=1024 count=262144
    mkswap swap 
    chmod 600 swap
    swapon /home/system/swap

This creates a 256MiB swap file and then gets the system to start using it. Please note that I locked down the permissions of the swap file so that only root has access. This is a sensible and necessary security precaution. After doing this, simply add the following line to your /etc/fstab file to have this swap file mounted automatically on boot-up (the effect of the swapon command only persists until the next reboot).

    /home/system/swap  none  swap  sw  0  0

This line should be inserted after the line that mounts /dev/sdb1 as it is that device that contains the /home file system (although this shouldn’t matter as the system should work out the order for you, but it’s best to be explicit just in case).

Hardware Issues

Wifi Disconnects

So far, touch wood, the only major issue has been the Wifi interface going offline after about five minutes or so. Some investigation and experimentation confirmed that this was a power saving issue. I resolved this by disabling power saving for the interface by doing:

    cd /etc/pm/power.d
    cat << EOF > wireless
    iwconfig wlan0 power off
    chmod 755 wireless

Putting the netbook into suspend mode still works as expected.

Disabling Wifi Altogether

The only other, much less significant, issue that I’ve had is that despite turning off the Wifi in the BIOS, Ubuntu is able to turn it back on again. However I didn’t look into this that much because I usually have the Wifi turned on anyway. I suspect the easiest way of preventing this from happening is to black list the relevant Wifi drivers by doing something like:

    cd /etc/modprobe.d
    cat << EOF > blacklist-wifi.conf
    blacklist rt2800lib
    blacklist rt2800mmio
    blacklist rt2800pci
    blacklist rt2x00pci
    chmod 644 blacklist-wifi.conf

Minimising Writes To The SSD

This netbook uses an SSD and so it’s a really good idea to minimise the amount of unnecessary writing that can go on.

Using RAM Based Union File Systems

You may remember that I have previously mentioned union file systems as a way of combining separate file systems into one unified whole. Well these can also be used to create a copy on write file system where any changes are redirected to a RAM disk (tmpfs being one such RAM based file system). This has the effect of preventing writes to the underlying hard disk, with any changes being lost on reboot. I applied this technique to files under /var.

Basically you create an area where you mount your tmpfs file systems and then you layer them on top of the underlying disk file systems, such that modifications are redirected to tmpfs. The specific areas I targeted were /tmp, /var/cache and /var/log. I did this as follows:

    apt-get install aufs-tools
    cd /var
    mkdir -p aufs/cache
    mkdir -p aufs/log
    chmod 755 aufs
    cd aufs
    chmod 755 cache
    chmod 775 log
    chgrp syslog log

I then added the following lines to the /etc/fstab file:

    tmpfs  /tmp             tmpfs  defaults,noatime,mode=1777                      0  0
    tmpfs  /var/tmp         tmpfs  defaults,noatime,mode=1777                      0  0
    tmpfs  /var/aufs/cache  tmpfs  defaults,noatime,mode=0755                      0  0
    tmpfs  /var/aufs/log    tmpfs  defaults,noatime,mode=0775,gid=104              0  0
    none   /var/cache       aufs   defaults,dirs=/var/aufs/cache=rw:/var/cache=ro  0  0
    none   /var/log         aufs   defaults,dirs=/var/aufs/log=rw:/var/log=ro      0  0

The changes will then take effect on the next reboot. Just before you reboot you may want to clear out the contents of the /tmp and /var/tmp directories, do an apt-get clean and tidy up some of the log files under /var/log.

Please note that /tmp and /var/tmp are handled slightly differently from the other two areas as I have only used a tmpfs file system for them. This is simply because those directories are normally empty when the system boots up and so there’s nothing to expose from the underlying file system via the aufs copy on write technique.

Reducing Swap Usage

Linux will tend to swap fairly aggressively in order to free up as much memory as possible. One can reduce this so that swapping only occurs when it absolutely has to by doing:

    cd /etc/sysctl.d
    cat << EOF > 20-site.conf
    # Reduce use of swap to the minimum allowed.
    vm.swappiness = 1
    chmod 644 20-site.conf

Don’t be tempted to set vm.swappiness to zero as that will turn off swap altogether (please note that this is different from older versions of Linux). If you don’t want any swapping at all then simply don’t have a swap file, it’ll save you the disk space.

Firefox Cache

It’s also a good idea to turn off the cache in Firefox. This can be done by going to Preferences -> Advanced -> Network, turning off automatic cache management and setting the cache size to zero.


As with most operating systems, there is a load of stuff running that isn’t necessarily needed.

System Services

There are a number of services that can be turned off without causing undue effect. I wasn’t interested in the zero configuration services offered by Avahi (DHCP is suffice for my needs), bluetooth, printing via Cups, additional virtual consoles nor reporting kernel bugs via Whoopsie. Please bear this in mind when looking at the following commands, your requirements may be different from mine. Anyway this is how I disabled these services:

    cd /etc/init
    echo manual > avahi-cups-reload.override
    echo manual > avahi-daemon.override
    echo manual > bluetooth.override
    echo manual > cups.override
    echo manual > tty2.override
    echo manual > tty3.override
    echo manual > tty4.override
    echo manual > tty5.override
    echo manual > tty6.override
    cd /etc/rc2.d
    mv S20kerneloops K80kerneloops

Again the changes will take effect on the next reboot.

Desktop Services

Ok so you have tamed the system services, so what about those processes that get started when you log into your desktop? You may be tempted to use the Startup Applications utility to disable those unwanted processes, but you’ll find that there isn’t much listed. To remedy this do:

    cd /etc/xdg/autostart
    sed -i "s/NoDisplay=true/NoDisplay=false/g" *.desktop

When you rerun Startup Applications you should find you now have a much larger list. Disable what you don’t need. For me this included backup services, chat, desktop sharing, file sharing, screen reader, update notifier (I manually download and install updates when I find it convenient) and zeitgeist datahub.

Other Things To Do

This section isn’t necessarily anything to do with installing on the Asus Eee PC, but rather contains tips that you may wish to do on any installation of Ubuntu.

The Login Screen And The Guest Account

It would probably be a good idea to hide user names on the login screen and disable the guest account. Why allow strangers access to your computer if you don’t need that facility? Also by removing user names from the login screen it makes it harder for someone to break in as they’ve not only got to guess your password but your user name as well. I have the following in my /etc/lightdm/lightdm.conf.d file:


Securing Grub2

This should be done on every Linux installation, otherwise anyone can gain access by rebooting the computer, changing some parameters and gaining access as root. I won’t describe the break in process any further other than to say that the only thing that shouldn’t be protected by a Grub2 administration account is the ability to do a normal boot into a fully running system (i.e. lock down custom boot options, the editing of menu options and access to the Grub2 command line). The securing process is harder than it should be but do persevere.

The general process is:

  1. Firstly under /etc/grub.d create an 01_users file containing the administration password that you wish to use to secure your boot loader.

    First you need to create a cryptographically hashed password and then create the above file with that hash inside it.

    In this example I have used a password of fluffy so please remember to choose your own password and use your corresponding hash and not the one I have generated below!

    Set up the Grub2 administration user as follows:

    • Generate the password hash as follows:

        Enter password: 
        Reenter password: 
        PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.18A632EA331D2CFA18E2ACBDCDD02AE2682C988E4490E9672D6A3585117C90622F5F4CCCB104D4C233D7921633BD685C7EF078EC29C1963266F8CE9533387ECA.3FDD0B4073045B36E5B721690F55E5857E70FF78625D0BC70741B1F1B5368C1C09013C59D643A61DD9B5BB66416E222A18E305A03D803DBEF62743516CCA04D9
    • Create the /etc/grub.d/01_users file with the following contents:

        #! /bin/sh
        set -e
        # grub-mkconfig helper script.
        # Copyright (C) 2006,2007,2008,2009,2010  Free Software Foundation, Inc.
        # GRUB is free software: you can redistribute it and/or modify
        # it under the terms of the GNU General Public License as published by
        # the Free Software Foundation, either version 3 of the License, or
        # (at your option) any later version.
        # GRUB is distributed in the hope that it will be useful,
        # but WITHOUT ANY WARRANTY; without even the implied warranty of
        # GNU General Public License for more details.
        # You should have received a copy of the GNU General Public License
        # along with GRUB.  If not, see <>.
        locale_dir=`echo ${GRUB_PREFIX}/locale | sed ${transform}`
        grub_lang=`echo $LANG | cut -d _ -f 1`
        . ${libdir}/grub/grub-mkconfig_lib
        # Add user and password details.
        cat << EOF
        set superusers="admin"
        password_pbkdf2 admin grub.pbkdf2.sha512.10000.18A632EA331D2CFA18E2ACBDCDD02AE2682C988E4490E9672D6A3585117C90622F5F4CCCB104D4C233D7921633BD685C7EF078EC29C1963266F8CE9533387ECA.3FDD0B4073045B36E5B721690F55E5857E70FF78625D0BC70741B1F1B5368C1C09013C59D643A61DD9B5BB66416E222A18E305A03D803DBEF62743516CCA04D9

      Please note that the main preamble can be obtained by copying one of the other files in that directory and then editing it to suit your needs. Also remember to use your own password hash.

    • Then make sure it’s executable by doing:

        chmod 755 /etc/grub.d/01_users
    • Update Grub2 by doing:


    We have created a Grub2 administration user called admin with a password of fluffy. It’s now probably a good idea just to have a quick look at the generated Grub2 configuration file, /boot/grub/grub.cfg, to see if our changes have been added correctly.

  2. At this point you have secured access to all of Grub2; its command prompt, all of the boot menu options and the ability to temporarily edit a boot menu option and change the kernel’s arguments. Ideally we want anyone to be able to boot the system via one of the standard menu options but be unable to do anything else. This can be achieved by adding the --unrestricted option to the relevant menuentry statements. It can be quite tricky to get this right as it’s not necessarily clear which menuentry statements inside the files under the /etc/grub.d directory need changing. Luckily in this case we only need to modify one menu option in the /etc/grub.d/10_linux file at line 129. When edited correctly that part of the file should look like:

            echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-$version-$type-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
            echo "menuentry --unrestricted '$(echo "$os" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
        if [ "$quick_boot" = 1 ]; then
  3. The last change we need to make is to remove the memory test and recovery boot-up menu options. Incidentally the latter is useless anyway as it requires a root password, which Ubuntu doesn’t have! One can remove the memory test option by editing /etc/grub.d/20_memtest86+ and inserting an exit 0 statement on the second line of that file, and the recovery option by editing /etc/default/grub and uncommenting the line that says #GRUB_DISABLE_RECOVERY="true".
  4. Update Grub2 by doing:


Enabling The Ubuntu Boot Screen

If you want a nice simple boot-up screen rather than seeing the kernel messages then edit /etc/default/grub and change the line that starts with GRUB_CMDLINE_LINUX_DEFAULT= to read GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" in its entirety and then run the update-grub command.

Improving The Bootup Experience

If like me you went and eagerly enabled the nice boot splash screen by changing that line in /etc/default/grub to read GRUB_CMDLINE_LINUX_DEFAULT="quiet splash", you’ll no doubt be rather disappointed that on booting up the screen went blank for a very long time with the splash screen only appearing momentarily just before the login screen appeared. Most frustrating.

The trouble is that because we have used a server distribution it’s not configured by default to display a boot splash screen (what’s the point – it will be in a server room) and it is geared up to loading in lots of drivers for raids etc that we don’t need on our little netbook.

Luckily both are very easy to fix, we just need to reconfigure the kernel’s ram disk that is used to get the system booted.

Firstly, to turn on the boot flash screen as soon as the kernel starts, do:

    cd /etc/initramfs-tools/conf.d
    cat << EOF > splash
    chmod 644 splash

Secondly, in order to trim down the kernel’s ram disk so that it only contains those drivers that we are likely to need, simply edit the /etc/initramfs-tools/initramfs.conf file and change the line that says MODULES=most to say MODULES=dep and then save your changes.

When you have done these two steps you need to rebuild the kernel’s ram disk, do this by running:

    update-initramfs -u

Hopefully on the next boot it will take less time and you’ll get a splash screen from the start.

Caps-Lock Indicator

The Asus Eee PC doesn’t have a Caps-Lock indicator light so you’ll probably want to install some sort of Caps-Lock indicator. This is a really useful forum post, detailing all sorts of goodies that you can add to your desktop. For the Caps-Lock indicator simply search for keylock.

I installed this by doing:

    add-apt-repository ppa:tsbarnes/indicator-keylock
    apt-get update
    apt-get install indicator-keylock
    apt-get upgrade
    apt-get dist-upgrade
    apt-get install -f
    apt-get dist-upgrade
    apt-get clean

This may be a bit more repetitive than one would expect but the package pulled in some updated dependencies that triggered the apt-get dist-upgrade stages. Incidentally you might be interested to know that apt-get install -f is the command for checking and fixing broken package dependencies.

Once installed I then launched the Indicator-LocKeys utility and configured it.

Capping Per Process Memory Usage

Unfortunately some programs leak memory, the stock video player being one of them. In order to prevent excessive swapping I put a cap on how much an individual process can use. It’s not ideal as in Linux you can only stipulate the maximum total virtual memory size of a process and not the actual amount of resident RAM that is actually being used (trying to limit the RAM size only results in the process swapping above that limit, which is precisely what we are trying to avoid).

I did this by doing:

    cd /etc/profile.d
    cat << EOF >
    # Limit each process to 1024MiB of memory.
    ulimit -S -v 1048576 # 524288 786432 1048576
    chmod 644

This gives enough virtual memory for Firefox to run but stops excessive swapping when something starts to leak memory. The offending process will normally exit or fail with an ENOMEM error code or a SIGBUS signal.

Incidentally you can use this file to put in any other custom commands that you want executed every time a user logs in.

File Listings

I have listed here some of the key configuration files and scripts that I have discussed previously.


    # /etc/fstab: static file system information.
    # Use 'blkid' to print the universally unique identifier for a
    # device; this may be used with UUID= as a more robust way to name devices
    # that works even if disks are added and removed. See fstab(5).
    # <file system>    <mount point>    <type>  <options>                                       <dump>  <pass>
    /dev/sda1          /                ext2    defaults,noatime,errors=remount-ro              0       0
    /dev/sdb1          /home            ext2    defaults,noatime                                0       1
    /home/system/swap  none             swap    sw                                              0       0
    tmpfs              /tmp             tmpfs   defaults,noatime,mode=1777                      0       0
    tmpfs              /var/tmp         tmpfs   defaults,noatime,mode=1777                      0       0
    tmpfs              /var/aufs/cache  tmpfs   defaults,noatime,mode=0755                      0       0
    tmpfs              /var/aufs/log    tmpfs   defaults,noatime,mode=0775,gid=104              0       0
    none               /var/cache       aufs    defaults,dirs=/var/aufs/cache=rw:/var/cache=ro  0       0
    none               /var/log         aufs    defaults,dirs=/var/aufs/log=rw:/var/log=ro      0       0


    # If you change this file, run 'update-grub' afterwards to update
    # /boot/grub/grub.cfg.
    # For full documentation of the options in this file, see:
    #   info -f grub -n 'Simple configuration'
    GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
    # Uncomment to enable BadRAM filtering, modify to suit your needs
    # This works with Linux (no patch required) and with any kernel that obtains
    # the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
    # Uncomment to disable graphical terminal (grub-pc only)
    # The resolution used on graphical terminal
    # note that you can use only modes which your graphic card supports via VBE
    # you can see them in real GRUB with the command `vbeinfo'
    # Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
    # Uncomment to disable generation of recovery mode menu entries
    # Uncomment to get a beep at grub start
    #GRUB_INIT_TUNE="480 440 1"

Blurry Picture

What article would be complete without a blurry picture of the finished result! Just to prove that I have actually got this running on my netbook:


I hope you have found this post of some use. Good luck.


6 thoughts on “Installing Ubuntu On An Asus Eee 901 PC

  1. Great post!! I had an old 901 with the original linux system running and was about to throw it away as I had no clue how to get an up to date system running on it. This guide was perfect and now the 901 is running the latest ubuntu system. Thanks!

  2. Many thanks for this excellent tutorial! I was desperate finding a solution to install Ubuntu on my old eeePC 901. I followed your enlightened advices and it worked flawlessly.

    Also, I would like to advise to anyone installing the minimal Unity interface (apt-get install –no-install-recommends ubuntu-desktop) to install at least gnome-terminal and unity-lens-applications too. It helps a lot to get an access to a terminal once Unity is running 😉

    • Back up your data or even the fully current installation with a knoppix live cd and use ntfsclone to backup the system, then follow my instructions in the article. If you have tried this and failed due to lack of space then it may be because you didn’t destroy the existing partitions used by MS-Windows.

      If none of this makes much sense then I’d find a technical friend, offer to buy him a drink or something and ask for his help in return. I make no pretence about the fact that this article is for people with some technical experience and/or those that don’t mind completely trashing their netbook if they make a mistake. Good luck :-).

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s