Skip to main content.

Installing Debian on PowerPC based systems using U-Boot


This document describes how to install Debian GNU/Linux 3.0 (woody) on PowerPC based systems equipped with the U-Boot bootloader. Both, the root filesystem and the installation media will be mounted via NFS. This document is based on work of Bernhard Kuhn (


The following installation instructions have been successfully tested with TQM860L and LITE5200 boards and U-Boot-0.3.0. Other versions of U-Boot should work as well.

Software Reqirements

On the Linux host, you need to have an TFTP and NFS server up and running. For the target, you need to download the PowerPC binary iso image "woody-powerpc-1.iso", i.e. from:

Copy or move the iso image to the /tmp directory on your host machine (not to the target file system).

For the following instructions, it is assumed that your host has the IP address and the target has

Preparing the host for installation

In order to be able to install Debian on the target, you first need to prepare several files, directories and services on the host: login as root on the host and perform the following steps:

  1. Prepare an NFS root directory for the target, i.e.
         install -d /tftpboot/
  2. Loop-back mount the iso image and copy the content to the NFS directory of the target
         install -d /mnt/loop
         install -d /tftpboot/
         mount -o loop /tmp/woody-powerpc-1.iso /mnt/loop
         cp -vax /mnt/loop/* /tftpboot/
         umount /mnt/loop
  3. Prepare the installation ramdisk image:
         cp /tftpboot/ /tftpboot/
         /opt/Embedix/bsp/mpc5200icecube-2.0/emb-bin/mkimage \
            -T ramdisk -d /tftpboot/root.bin /tftpboot/root.bin.img
    The location of "mkimage" may vary.
  4. Add an NFS export entry for the target and restart the NFS server:
         echo "/tftpboot/,no_root_squash)" \
           >> /etc/exports
         /etc/rc.d/init.d/nfs stop
         /etc/rc.d/init.d/nfs start
    For SuSE, use /etc/rc.d/nfsserver instead.
  5. Compile the kernel for the target and place the U-Boot compliant kernel image to /tftpboot as "uImage".

    Please note that the kernel needs support for initial ramdisk and that a "cat /proc/cpuinfo" on the target needs to show an entry like this:
         machine : PReP
    Otherwise the Debian installer will complain about a not yet supported platform and stop operation.

    Usualy, you need to modifiy the kernel to archive this behaviour.

    For the TQM860, just add the line
         len += sprintf(len+buffer,"machine\t\t: PReP\n");
    in file arch/ppc/kernel/m8xx_setup.c, function m8xx_setup_residual().

    For IceCube+, change the appropriate line to
         seq_printf(m, "machine\t\t: PReP\n");
    in file arch/ppc/platforms/icecube.c, function icecube_show_cpuinfo().

Preparing the target for Installation

Setup several bootloader environment variables on the U-Boot command line prompt. make sure that U-Boot has been installed on the target, do a reset and type in the following lines after the bootloader comes up on the serial terminal (default com parameters: 115200,8,n,1):

  setenv ethaddr 00:11:22:33:44:55
  setenv ipaddr
  setenv serverip
  setenv bootcmd tftp 100000 /tftpboot/uImage \; tftp 200000 /tftpboot/root.bin.img \; bootm 100000 200000
  setenv bootargs root=/dev/ram rw

Installing Debian

  1. Reset the target. After the autoboot sequence, the kernel and the installation root filesystem should be downloaded via the network, both will be uncompressed, the kernel will boot and mount the ramdisk. Finally, the Debian installer intro will come up on the serial console. Just press to continue.
  2. Skip the Keyboard configuration and select "Configure the hostname" alternativly - just accept the default "debian"
  3. Accept "Next: Configure the Network", don't do "Automatic Network Configuration". Enter the following values during network configuration:
         IP address:
         Domain name:
         DNS server:
    Some of these parameter may differ in your setup.

    After the network setup, you should be returned to the "Debian GNU/Linux Installation Main Menu"
  4. Select "Do Without a Swap Partition" and accept "Yes" in the next dialog.
  5. Now choose "Execute a Shell" and type mount the target root filesystem manually:
         mount -o nolock -t nfs /target
    Type "exit" in order to return to the main menu.
  6. Select "Install the Base System" in the main menu.
  7. In the "Select Installation Medium" dialog, choose "mounted : already mounted filesystem".
  8. Accept the given "partition" in the next dialog.
  9. Choose "manually : Enter the directory manually" in the "Select Debian Archive path" dialog box and enter
    as the directory that contains the Archive files.

    The installation process will start, now. For the TQM860l, this took about an hour to complete. After the installation, the configuration of several packages will fail - this is not fatal. Just press until you end up in the main menu, again.
  10. Reset the target, wait until the bootloader shows up and interrupt the autoboot sequence.

Preparing the target filesystem for operation

After the installation, you need to modify several files on the target filesystem. It's easier to do these changes on the export filesystem on the host:

  1. In /tftpboot/, comment out the following entries:
         1:2345:respawn:/sbin/getty 38400 tty1
         2:23:respawn:/sbin/getty 38400 tty2
         3:23:respawn:/sbin/getty 38400 tty3
         4:23:respawn:/sbin/getty 38400 tty4
         5:23:respawn:/sbin/getty 38400 tty5
         6:23:respawn:/sbin/getty 38400 tty6
    and add the following entry:
         T0:23:respawn:/sbin/getty 115200 ttyS0
  2. In /tftpboot/, add an entry for the serial console:
  3. Goto to /tftpboot/ and type:
         mv start-stop-daemon start-stop-daemon.FAKE
         mv start-stop-daemon.REAL start-stop-daemon
    to correct some installation wiredness.
  4. Goto /tftpboot/ and type:
         find rc* -name "S*pcmcia" | xargs rm
         find rc* -name "K*pcmcia" | xargs rm
         find rc* -name "S*hwclock*" | xargs rm
         find rc* -name "K*hwclock*" | xargs rm
    to get rid of hwclock and pcmcia startup script invocation
  5. In /tftpboot/ change line 27 ("rootcheck=yes") into "rootcheck=no". Then comment out lines 169 and 174:
         line 169:  #mount -n -o remount,$rootmode /
         line 174:  #mount -f -o remount /
  6. Goto /tftpboot/ and type:
         echo "server" > ntp.conf
         echo "deb file:/var/ftp/debian woody main" > apt/sources.list
         echo "none                    /proc                   proc    defaults        0 0" >> fstab
         rm resolv.conf
         cat > resolv.conf << EOF
    for adjusting certain settings.
  7. Goto /tftpboot/ and type:
         install -d lib/modules/2.4.21-rc1/kernel

Preparing the target bootloader for operation

Finally setup the bootloader to automatically load the kernel and boot Debian via nfs:

  setenv bootargs root=/dev/nfs rw nfsroot= ip=
  setenv bootcmd tftpboot 100000 /tftpboot/uImage \; bootm 100000
After reset, the Debian should boot. Login as root, there is no password.

Optimizing Debian for operation

After booting Debian in the target, login as root and perform the following steps:

  1. Install ntpdate
         apt-get update  
         apt-get install ntpdate
    Now reset the target and login as root, again.
  2. Install certain packages that will allow you to compile a kernel nativly:
         apt-get install gcc
         apt-get install g++
         apt-get install make
         apt-get install ssh
  3. Apply a password for root, or otherwise you won't be able to login via ssh.
  4. Reset the target to make sshd effective. Alternativly, start sshd manually.

Compiling a Kernel nativly

  1. Prepare the target filesystem on the host. Type:
         cd /tftpboot/
         ln -s
         cp -a /usr/include/ncurses* /tftpboot/
         cp -a /opt/Embedix/home/kuhn/project/mpc5200-4/src/linuxppc_2_4_mpc5200 /tftpboot/
    The patch from where to take the kernel may certainly vary in your setup.

    Please note that the ncurses header files for the target are taken from the host. The clean solution would be to compile the ncurses library nativly.
  2. Login into the target via ssh and type:
         cd /usr/src/linux
         cp .config config_icecube
         make CROSS_COMPILE= distclean
         cp config_icecube .config
         make CROSS_COMPILE= menuconfig
         make CROSS_COMPILE= uImage