Installing Debian GNU/Linux to your A20-OLinuXino-Lime2.

So you bought an open hardware Lime2 board, and now would like to install Debian on it, without resorting to pre-compiled images offered on the Olimex wiki. Since February 2015, this is actually possible using Debian-provided binaries.

Prepare u-boot

Easiest is to use u-boot from unstable, and extract /usr/lib/u-boot/A20-OLinuXino-Lime2/u-boot-sunxi-with-spl.bin from it. Alternatively, you will need to cross-compile u-boot for your A20 board on your Debian GNU/Linux box. The needed architecture for this processor is armhf.

sudo dpkg --add-architecture armhf
sudo update
sudo apt-get install crossbuild-essential-armhf

Download the latest release of u-boot, at the time of writing u-boot-2015.01. This version already supports everything needed to get Debian on your Lime2 using an SD card, USB stick and a network install of the OS. We will install Debian (and u-boot) to the SD card. The USB stick is only used during the installation process, and can be re-used for other purposes once all is done. (As of April 2015, it is also possible to do without an USB stick altogether and install from an SD card.)

Compile u-boot as follows:

make A20-OLinuXino-Lime2_config ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

Copy u-boot to an SD card

Copy the compiled or extracted u-boot image to your micro SD card. No need for partitioning it - one VFAT or ext2 partition should do.

sudo dd if=~/Downloads/u-boot-2015.01/u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8

Prepare the Debian Installer

At the time of writing, the weekly images of the CD build are broken, so the excellent tutorial on installing Debian on the Allwinner cannot be fully followed. Instead, unpack the hd-media image of d-i on your USB stick. Next, download 2 files.


and overwrite the copy of vmlinuz on the USB stick with this one.

We will modify the initrd.gz image slightly. Since you may not have a console cable, it's useful to perform the install using preseeding. This way, the Debian installer will get its answers from a file instead of through your input. I opted to automate as many answers as possible, except for the partitioning. These can be answered by logging in to the installer using SSH. It's truly an awesome, versatile tool, d-i!

First, create preseed.cfg. For Debian Jessie, the following file will work.

#### Contents of the preconfiguration file (for jessie)
### Localization
# Preseeding only locale sets language, country and locale.
d-i debian-installer/locale string en_AU

# The values can also be preseeded individually for greater flexibility.
#d-i debian-installer/language string en
#d-i debian-installer/country string NL
#d-i debian-installer/locale string en_GB.UTF-8

# Keyboard selection.
d-i keyboard-configuration/xkb-keymap select au
# d-i keyboard-configuration/toggle select No toggling

### Network configuration
# netcfg will choose an interface that has link if possible. This makes it
# skip displaying a list if there is more than one interface.
d-i netcfg/choose_interface select auto

# To pick a particular interface instead:
#d-i netcfg/choose_interface select eth1

# To set a different link detection timeout (default is 3 seconds).
# Values are interpreted as seconds.
#d-i netcfg/link_wait_timeout string 10

# If you have a slow dhcp server and the installer times out waiting for
# it, this might be useful.
#d-i netcfg/dhcp_timeout string 60
#d-i netcfg/dhcpv6_timeout string 60

# If you prefer to configure the network manually, uncomment this line and
# the static network configuration below.
d-i netcfg/disable_autoconfig boolean true

# If you want the preconfiguration file to work on systems both with and
# without a dhcp server, uncomment these lines and the static network
# configuration below.
#d-i netcfg/dhcp_failed note
#d-i netcfg/dhcp_options select Configure network manually

# Static network configuration.
# IPv4 example
d-i netcfg/get_ipaddress string
d-i netcfg/get_netmask string
d-i netcfg/get_gateway string
d-i netcfg/get_nameservers string
d-i netcfg/confirm_static boolean true
# Any hostname and domain names assigned from dhcp take precedence over
# values set here. However, setting the values still prevents the questions
# from being shown, even if values come from dhcp.
d-i netcfg/get_hostname string YOURHOSTNAME
d-i netcfg/get_domain string YOURDOMAIN.TLD

# If you want to force a hostname, regardless of what either the DHCP
# server returns or what the reverse DNS entry for the IP is, uncomment
# and adjust the following line.
#d-i netcfg/hostname string somehost

# Disable that annoying WEP key dialog.
d-i netcfg/wireless_wep string
# The wacky dhcp hostname that some ISPs use as a password of sorts.
#d-i netcfg/dhcp_hostname string radish

# If non-free firmware is needed for the network or other hardware, you can
# configure the installer to always try to load it, without prompting. Or
# change to false to disable asking.
d-i hw-detect/load_firmware boolean true

### Network console
# Use the following settings if you wish to make use of the network-console
# component for remote installation over SSH. This only makes sense if you
# intend to perform the remainder of the installation manually.
d-i anna/choose_modules string network-console
#d-i network-console/authorized_keys_url string
d-i network-console/password password STRONGPASSWORD
d-i network-console/password-again password STRONGPASSWORD

### Mirror settings
# If you select ftp, the mirror/country string does not need to be set.
#d-i mirror/protocol string ftp
d-i mirror/country string Australia
d-i mirror/http/hostname string
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string

# Suite to install.
d-i mirror/suite string testing
# Suite to use for loading installer components (optional).
#d-i mirror/udeb/suite string testing

### Account setup
# Skip creation of a root account (normal user account will be able to
# use sudo).
#d-i passwd/root-login boolean false
# Alternatively, to skip creation of a normal user account.
#d-i passwd/make-user boolean false

# Root password, either in clear text
d-i passwd/root-password password VERYSTRONG
d-i passwd/root-password-again password VERYSTRONG
# or encrypted using an MD5 hash.
#d-i passwd/root-password-crypted password [MD5 hash]

# To create a normal user account.
d-i passwd/user-fullname string Your Full Name
d-i passwd/username string yoursystemname
# Normal user's password, either in clear text
d-i passwd/user-password password REALLYSTRONG
d-i passwd/user-password-again password REALLYSTRONG
# or encrypted using an MD5 hash.
#d-i passwd/user-password-crypted password [MD5 hash]
# Create the first user with the specified UID instead of the default.
#d-i passwd/user-uid string 1010

# The user account will be added to some standard initial groups. To
# override that, use this.
#d-i passwd/user-default-groups string audio cdrom video

### Clock and time zone setup
# Controls whether or not the hardware clock is set to UTC.
d-i clock-setup/utc boolean true

# You may set this to any valid setting for $TZ; see the contents of
# /usr/share/zoneinfo/ for valid values.
d-i time/zone string Australia/Perth

# Controls whether to use NTP to set the clock during the install
d-i clock-setup/ntp boolean true
# NTP server to use. The default is almost always fine here.
#d-i clock-setup/ntp-server string

### Partitioning

## Partitioning example
# If the system has free space you can choose to only partition that space.
# This is only honoured if partman-auto/method (below) is not set.
#d-i partman-auto/init_automatically_partition select biggest_free

# Alternatively, you may specify a disk to partition. If the system has only
# one disk the installer will default to using that, but otherwise the device
# name must be given in traditional, non-devfs format (so e.g. /dev/hda or
# /dev/sda, and not e.g. /dev/discs/disc0/disc).
# For example, to use the first SCSI/SATA hard disk:
#d-i partman-auto/disk string /dev/sda
# The SD card of your OLinuXino-Lime2 will probably be mmcblk0
#d-i partman-auto/disk string /dev/mmcblk0

# In addition, you'll need to specify the method to use.
# The presently available methods are:
# - regular: use the usual partition types for your architecture
# - lvm: use LVM to partition the disk
# - crypto: use LVM within an encrypted partition
#d-i partman-auto/method string lvm

# If one of the disks that are going to be automatically partitioned
# contains an old LVM configuration, the user will normally receive a
# warning. This can be preseeded away...
#d-i partman-lvm/device_remove_lvm boolean true
# The same applies to pre-existing software RAID array:
#d-i partman-md/device_remove_md boolean true
# And the same goes for the confirmation to write the lvm partitions.
#d-i partman-lvm/confirm boolean true
#d-i partman-lvm/confirm_nooverwrite boolean true

# You can choose one of the three predefined partitioning recipes:
# - atomic: all files in one partition
# - home: separate /home partition
# - multi: separate /home, /var, and /tmp partitions
#d-i partman-auto/choose_recipe select atomic

# This makes partman automatically partition without confirmation, provided
# that you told it what to do using one of the methods above.
#d-i partman-partitioning/confirm_write_new_label boolean true
#d-i partman/choose_partition select finish
#d-i partman/confirm boolean true
#d-i partman/confirm_nooverwrite boolean true

# This makes partman automatically partition without confirmation.
#d-i partman-md/confirm boolean true
#d-i partman-partitioning/confirm_write_new_label boolean true
#d-i partman/choose_partition select finish
#d-i partman/confirm boolean true
#d-i partman/confirm_nooverwrite boolean true

## Controlling how partitions are mounted
# The default is to mount by UUID, but you can also choose "traditional" to
# use traditional device names, or "label" to try filesystem labels before
# falling back to UUIDs.
d-i partman/mount_style select uuid

### Base system installation
# Configure APT to not install recommended packages by default. Use of this
# option can result in an incomplete system and should only be used by very
# experienced users.
#d-i base-installer/install-recommends boolean false

# The kernel image (meta) package to be installed; "none" can be used if no
# kernel is to be installed.
#d-i base-installer/kernel/image string linux-image-586

### Apt setup
# You can choose to install non-free and contrib software.
#d-i apt-setup/non-free boolean true
#d-i apt-setup/contrib boolean true
# Uncomment this if you don't want to use a network mirror.
#d-i apt-setup/use_mirror boolean false
# Select which update services to use; define the mirrors to be used.
# Values shown below are the normal defaults.
d-i apt-setup/services-select multiselect security, updates
d-i apt-setup/security_host string

# Additional repositories, local[0-9] available
#d-i apt-setup/local0/repository string \
# http://local.server/debian stable main
#d-i apt-setup/local0/comment string local server
# Enable deb-src lines
#d-i apt-setup/local0/source boolean true
# URL to the public key of the local repository; you must provide a key or
# apt will complain about the unauthenticated repository and so the
# sources.list line will be left commented out
#d-i apt-setup/local0/key string http://local.server/key

# By default the installer requires that repositories be authenticated
# using a known gpg key. This setting can be used to disable that
# authentication. Warning: Insecure, not recommended.
#d-i debian-installer/allow_unauthenticated boolean true

### Package selection
tasksel tasksel/first multiselect standard

# Individual additional packages to install
d-i pkgsel/include string openssh-server
# Whether to upgrade packages after debootstrap.
# Allowed values: none, safe-upgrade, full-upgrade
d-i pkgsel/upgrade select none

# Some versions of the installer can report back on what software you have
# installed, and what software you use. The default is not to report back,
# but sending reports helps the project determine what software is most
# popular and include it on CDs.
popularity-contest popularity-contest/participate boolean false

### Boot loader installation
# Grub is the default boot loader (for x86). If you want lilo installed
# instead, uncomment this:
#d-i grub-installer/skip boolean true
# To also skip installing lilo, and install no bootloader, uncomment this
# too:
#d-i lilo-installer/skip boolean true

# This is fairly safe to set, it makes grub install automatically to the MBR
# if no other operating system is detected on the machine.
d-i grub-installer/only_debian boolean true

# This one makes grub-installer install to the MBR if it also finds some other
# OS, which is less safe as it might not be able to boot that other OS.
d-i grub-installer/with_other_os boolean true

# Due notably to potential USB sticks, the location of the MBR can not be
# determined safely in general, so this needs to be specified:
#d-i grub-installer/bootdev string /dev/sda
# To install to the first device (assuming it is not a USB stick):
#d-i grub-installer/bootdev string default

# Alternatively, if you want to install to a location other than the mbr,
# uncomment and edit these lines:
#d-i grub-installer/only_debian boolean false
#d-i grub-installer/with_other_os boolean false
#d-i grub-installer/bootdev string (hd0,1)
# To install grub to multiple disks:
#d-i grub-installer/bootdev string (hd0,1) (hd1,1) (hd2,1)

# Optional password for grub, either in clear text
#d-i grub-installer/password password r00tme
#d-i grub-installer/password-again password r00tme
# or encrypted using an MD5 hash, see grub-md5-crypt(8).
#d-i grub-installer/password-crypted password [MD5 hash]

# Use the following option to add additional boot parameters for the
# installed system (if supported by the bootloader installer).
# Note: options passed to the installer will be added automatically.
#d-i debian-installer/add-kernel-opts string nousb

### Finishing up the installation
# During installations from serial console, the regular virtual consoles
# (VT1-VT6) are normally disabled in /etc/inittab. Uncomment the next
# line to prevent this.
d-i finish-install/keep-consoles boolean true

# Avoid that last message about the install being complete.
d-i finish-install/reboot_in_progress note

Next, add your preseed.cfg to the downloaded initrd.gz

mkdir /tmp/initrd && cd /tmp/initrd
gzip -d < ~/Downloads/initrd.gz |cpio --extract --verbose --make-directories --no-absolute-filenames
cp ~/preseed.cfg .
find . | cpio -H newc --create --verbose | gzip -9 > ../initrd.gz

Copy the new initrd.gz to your USB stick.

Install Debian on your Lime2

If you want to follow along on a console (not really necessary, but easier to debug things this way.)

sudo apt-get install minicom sudo minicom --device /dev/ttyUSB0

Now plug in the micro SD card as well as the USB stick and power up your Lime2. After a little while, you will be able to ssh installer@ with your chosen password to set up the partitions. A while later, your Lime2 will be ready to use!

Installing wireless

I purchased a USB Wireless N WIFI dongle based on an Atheros chip. At the moment, this is the only chipset with a free firmware implementation supporting 802.11n. Please consider doing the same, to ensure this technology remains available for customers.

Build and install the firmware as explained on the Debian wiki. This will take a while, as the whole toolchain to build the firmware will be compiled for some reason.

Once you've installed the compiled firmware as explained, plug in the wifi dongle. The firmware will be loaded automatically.

Configuring your Lime2 as a wireless access point

Given the total lack of support for free software on ADSL2 modems, I have a very simple one and use my Lime2 board as wireless router. This instead of acquiring an expensive modem/router combo running proprietary software. The combined price is equivalent, and I have an option of installing some other software on the Lime2 too. Too bad one needs to ringfence an ADSL2 modem in your own house as if it's part of the internet, but that seems to be today's reality.

On the Lime2, install the following:

sudo apt-get install iw wireless-tools hostapd isc-dhcp-server

Edit 3 files as in the examples below.


auto wlan
iface wlan0 inet static
hostapd /etc/hostapd/hostapd.conf



# 802.11n support

# set country code

wpa_pairwise=TKIP CCMP


To configure your DHCP server, get your OpenNic DNS servers in the area - most of the server operators respect your privacy by not maintaining logs.

subnet netmask {
option domain-name-servers,;
option routers;
interface wlan0;

Restart networking & start the DHCP server, or reboot the system and you should be good to go.