RaspberryPi

Differences between revisions 1 and 60 (spanning 59 versions)
Revision 1 as of 2015-02-23 21:43:30
Size: 4654
Editor: fo0bar
Comment: Raspberry Pi Ubuntu information
Revision 60 as of 2018-04-30 08:28:10
Size: 23392
Editor: adamsmith
Comment: Added warning about wiping hard drive.
Deletions are marked like this. Additions are marked like this.
Line 2: Line 2:
= Raspberry Pi =
Line 6: Line 4:
Note that the information on this page currently only applies to the Raspberry Pi 2, not the original Raspberry Pi.

== Ubuntu 14.04 LTS ==
Note that the information on this page currently only applies to the Raspberry Pi 2 and 3B/3B+, not the original Raspberry Pi.

= Snappy Ubuntu Core =

[[http://developer.ubuntu.com/en/snappy/|Snappy Ubuntu Core]] is a new rendition of Ubuntu with transactional updates - a minimal server image with the same libraries as today’s Ubuntu, but applications are provided through a simpler mechanism. [[https://developer.ubuntu.com/core/get-started/raspberry-pi-2-3|Images are available]] for the Raspberry Pi 2 and 3.


= Ubuntu 'classic' =

== Download ==

These are not Ubuntu Core images, but the 'classic' deb based image. The Raspberry Pi 3 does not (yet) work with official Ubuntu images out of the box, but unofficial images are available.

=== Official images ===

==== armhf ====

 * Raspberry Pi 2: [[http://cdimage.ubuntu.com/ubuntu/releases/18.04/release/ubuntu-18.04-preinstalled-server-armhf+raspi2.img.xz|ubuntu-18.04-preinstalled-server-armhf+raspi2.img.xz]] (4G image, 296MB compressed)

 * Raspberry Pi 3: The official Raspberry Pi 2 images can be used with a Pi 3B/3B+ after minor changes (see instructions [[https://wiki.ubuntu.com/ARM/RaspberryPi#Booting_the_official_Pi_2_image_on_the_Pi_3B.2F3B.2B-|below]]).

 * Further releases can be found at http://cdimage.ubuntu.com/ubuntu/releases/

==== arm64 ====

 * The generic arm64 ISO images can be used with the Raspberry Pi 3. Instructions for booting these are [[https://wiki.ubuntu.com/ARM/RaspberryPi#Booting_generic_arm64_ISO_images|below]].

=== Unofficial images ===

These [[ARM/RaspberryPi/RaspberryPi3|Raspberry Pi 3]] images are built by [[fo0bar|Ryan Finnie]] using modified packages in a PPA ([[https://launchpad.net/~ubuntu-raspi2/+archive/ubuntu/ppa-rpi3|ppa:ubuntu-raspi2/ppa-rpi3]]), and are not supported directly by Canonical.

Raspberry Pi 3 B+ (2018) functionality is not yet available with these images.

 * Raspberry Pi 3: [[https://www.finnie.org/software/raspberrypi/ubuntu-rpi3/ubuntu-18.04-preinstalled-server-armhf+raspi3.img.xz|ubuntu-18.04-preinstalled-server-armhf+raspi3.img.xz]] (4G image, 296M compressed)
   * Updated 2018-04-28 (18.04 LTS)

 * Raspberry Pi 3: [[https://www.finnie.org/software/raspberrypi/ubuntu-rpi3/ubuntu-16.04-preinstalled-server-armhf+raspi3.img.xz|ubuntu-16.04-preinstalled-server-armhf+raspi3.img.xz]] (4G image, 252M compressed)
   * Updated 2018-04-21 (16.04.4 LTS)

== Installation ==

Installation is the same as other Raspberry Pi images; [[http://www.raspberrypi.org/documentation/installation/installing-images/README.md|a generic installation guide from raspberrypi.org is available here]].

/!\ WARNING: These commands have the potential to wipe your hard drive! /!\

For example:
{{{
xzcat ubuntu.img.xz | sudo dd bs=4M of=/dev/mmcblk0
}}}

Or using ddrescue (must decompress the image first):
{{{
unxz ubuntu.img.xz
sudo ddrescue -D -d --force ubuntu.img /dev/mmcblk0
}}}

== Username/Password ==

On the server images the login username is "ubuntu", password is "ubuntu". You will be asked to change the password on first login.

== Optional PPAs ==

While the official image includes compatible firmware, bootloader and kernel, there are a few packages available in an unofficial PPA ([[https://launchpad.net/~ubuntu-raspi2/+archive/ubuntu/ppa|ppa:ubuntu-raspi2/ppa]]) which are useful on the Raspberry Pi, including:

 * {{{libraspberrypi-bin}}} - VideoCore utilities from https://github.com/raspberrypi/userland such as vcgencmd, raspistill, etc.
 * {{{libraspberrypi-bin-nonfree}}} - Binary VideoCore utilities not provided in the open source userland repository, currently vcdbg and edidparser.
 * {{{xserver-xorg-video-fbturbo}}} - An accelerated x.org video driver, though this is limited to hardware accelerated window moving/scrolling on the Raspberry Pi.
 * {{{hello-dkms}}} - Not strictly to do with the Raspberry Pi, but a small example DKMS project to test building kernel DKMS modules.

To install:
{{{
sudo add-apt-repository ppa:ubuntu-raspi2/ppa
sudo apt-get update
}}}

Further Raspberry Pi packages can be found in the [[https://launchpad.net/~ubuntu-pi-flavour-makers/+archive/ubuntu/ppa|Ubuntu Pi Flavour Maker PPA]].

== Desktop ==

This is a small ubuntu-server image. If you want a full desktop, go ahead and do so:
{{{
$ sudo apt-get install xubuntu-desktop # or
$ sudo apt-get install lubuntu-desktop # or
$ sudo apt-get install kubuntu-desktop # etc
}}}

Ubuntu (Unity) and Ubuntu-GNOME just display a blank screen, presumably because they require 3D compositing. Kubuntu works but is slow unless you turn off desktop effects under System Settings. Xubuntu and Lubuntu work fine out of the box.

Tasks can be installed and removed with [[https://help.ubuntu.com/community/Tasksel|Tasksel]].

== Accelerated X driver ==

An accelerated x.org video driver is available (fbturbo), though this is limited to hardware accelerated window moving/scrolling on the Raspberry Pi. Install the optional PPA above, then:
{{{
$ sudo apt-get install xserver-xorg-video-fbturbo
}}}
Then add this to {{{/etc/X11/xorg.conf}}} (create if it doesn't already exist):
{{{
Section "Device"
    Identifier "Raspberry Pi FBDEV"
    Driver "fbturbo"
    Option "fbdev" "/dev/fb0"
    Option "SwapbuffersWait" "true"
EndSection
}}}

== VideoCore ==

As with Raspbian, !VideoCore packages are available. Install the optional PPA above, then:
{{{
$ sudo apt-get install libraspberrypi-bin libraspberrypi-dev
}}}
However, since these packages are compiled from source during build, the files are installed in their "proper" locations in /usr. Some third-party scripts may expect e.g. {{{/opt/vc/bin/vcgencmd}}}; if so, this hack should do it:
{{{
$ sudo ln -s /usr /opt/vc
}}}
(Raspbian packages use precompiled repositories during build, which install in {{{/opt/vc}}}.) {{{vcdbg}}} and {{{edidparser}}} are not part of the open source package and must be installed separately:
{{{
$ sudo apt-get install libraspberrypi-bin-nonfree
}}}

== Booting the official Pi 2 image on the Pi 3B/3B+ ==

The official Ubuntu images use u-boot as the bootloader. The u-boot binary built for the Pi 2 does not work on the Pi 3 and this is why there are separate images for the Pi 2 and Pi 3. However, the Raspberry Pi has its own built in bootloader. This can be used with a few changes to the config.txt file on the system-boot partition.

Write the image to an SD card as normal, but before you insert it into the Pi mount the two partitions so that you can make changes. Open the config.txt on the first partition (labelled system-boot). Change the kernel line, add an initramfs line, and comment out (#) the device_tree_address line as follows:

{{{
kernel=vmlinuz
initramfs initrd.img followkernel
#device_tree_address=0x02000000
}}}

Now copy the dtb file for your machine (e.g. bcm2710-rpi-3-b.dtb) plus the overlay folder if needed from /lib/firmware/4.X.X-XXXX-raspi2/device-tree to the system-boot partition.

For the Pi 3B+ you will also have to [[https://wiki.ubuntu.com/ARM/RaspberryPi#Updating_the_Pi_GPU_firmware_and_bootloader_files|update the Pi bootloader files]] (bootcode.bin, fixup.dat and start.elf) on the system-boot partition.

Place the SD card in your Pi and turn on!

If your new machine is missing from the flash-kernel database ("unsupported platform" error message when you update the kernel) then add an entry to /etc/flash-kernel/db. The full database can be found at /usr/share/flash-kernel/db/all.db. For the Machine field use the output of:

{{{cat /proc/device-tree/model ; echo}}}

If you need to manually copy across the kernel and initrd files (note, the system-boot partition is mounted at /boot/firmware):
{{{
sudo cp /boot/vmlinuz /boot/firmware/
sudo cp /boot/initrd.img /boot/firmware/
}}}

== USB booting ==

The Raspberry Pi 3 (and Pi 2 v1.2 with the same BCM2837 SoC as the Pi3) is capable of booting from a USB drive. To do this you'll first need to [[https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/msd.md|program USB boot mode]] (this is unnecessary on the 3B+ as USB booting is on by default).

You must have bootloader files (confusingly referred to as the firmware on the Raspberry Pi) from after April 2017. So [[https://wiki.ubuntu.com/ARM/RaspberryPi#Updating_the_Pi_GPU_firmware_and_bootloader_files|grab the latest bootcode.bin, fixup.dat and start.elf and copy them to your system-boot partition]].

Edit the cmdline.txt file
{{{
sudo nano /boot/firmware/cmdline.txt
}}}
and change root=/dev/mmcblk0p2 to root=LABEL=cloudimg-rootfs

If you are using a lot of drives then you may wish to switch to using the [[https://help.ubuntu.com/community/UsingUUID|UUID]] of the partition.

== WiFi ==
The built-in !WiFi on the Pi 3B and 3B+ requires some updated/extra files:
{{{
mkdir wifi-firmware
cd wifi-firmware
# Pi 3B
wget https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm/brcmfmac43430-sdio.bin
wget https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm/brcmfmac43430-sdio.txt
# Pi 3B+
wget https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm/brcmfmac43455-sdio.bin
wget https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm/brcmfmac43455-sdio.clm_blob
wget https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm/brcmfmac43455-sdio.txt
sudo cp *sdio* /lib/firmware/brcm/
cd ..
}}}

Reboot the machine.

Use dpkg-divert to stop these files being overwritten on package updates.

== Updating the Pi GPU firmware and bootloader files ==

Currently (26/4/2018) Ubuntu 18.04 ships with old copies of the GPU firmware and bootloader files (start*.elf, fixup*.dat and bootcode.bin). Consequently features like USB booting and machines like the Pi 3B+ do not work out of the box.

The very latest files can be found at https://github.com/raspberrypi/firmware, but releases can also be downloaded from http://archive.raspberrypi.org:

{{{
wget http://archive.raspberrypi.org/debian/pool/main/r/raspberrypi-firmware/raspberrypi-bootloader_1.20180417-1_armhf.deb
dpkg-deb -x raspberrypi-bootloader_1.20180417-1_armhf.deb /tmp/pi-bootloader
}}}

If you are doing this on an installed system, remove the linux-firmware-raspi2 package before copying the new files to the system-boot partition:

{{{
sudo apt remove linux-firmware-raspi2
sudo cp /tmp/pi-bootloader/boot/* /boot/firmware/
}}}

If you are preparing an SD card on another machine, then mount the FAT formatted system-boot partition and copy the files across
{{{
sudo mount /dev/XXX1 /mnt
sudo cp /tmp/pi-bootloader/boot/* /mnt
}}}

== Ubuntu arm64/AArch64 ==

'arm64' is the Debian port name for the 64-bit ARMv8 architecture, referred to as 'aarch64' in upstream toolchains (GNU triplet aarch64-linux-gnu), and some other distros.

BCM2837 is the chip used in the Raspberry Pi 3 and in later models of the Raspberry Pi 2. It packages a 64-bit quad-core ARM Cortex A53 (ARMv8) CPU with !VideoCore IV GPU.

There is a config.txt entry to make the ARM start in 64-mode (otherwise 32-bit mode is used):
{{{
arm_control=0x200
}}}
(This will fail to boot unless you provide a kernel compiled for 64-bit mode)

64 bit versions of the linux-raspi2 kernels were introduced in Ubuntu 16.10 (Yakkety Yak).

=== Multiarch ===

To set up [[https://wiki.debian.org/Multiarch/HOWTO|MultiArch]]:

{{{
sudo dpkg --add-architecture arm64
sudo apt update
}}}

Install the 64 bit kernel:
{{{
sudo apt install linux-image-raspi2:arm64
}}}

Install any other packages you want e.g. to run 64-bit Firefox:
{{{
sudo apt install firefox:arm64
}}}

Reboot

= Booting generic arm64 ISO images =

The generic arm64 linux kernels can also be used with a suitable bootloader. For example, the [[http://ports.ubuntu.com/dists/bionic/main/installer-arm64/current/images/netboot/|Bionic mini.iso]] and [[http://cdimage.ubuntu.com/ubuntu/releases/bionic/release/ubuntu-18.04-server-arm64.iso|ubuntu-18.04-server-arm64.iso]] can be booted with a [[https://www.suse.com/docrep/documents/a1f0ledpbe/UEFI%20on%20Top%20of%20U-Boot.pdf|u-boot-UEFI-grub2 combination]]. This can be achieved as follows:

== Create a partition with pi firmware/bootloader files ==
The Raspberry Pi's bootloader, built into the GPU and non-updateable, only has support for reading from FAT filesystems (both FAT16 and FAT32). So the first step is to create a partition on a SD card or USB device and format it as FAT.

Next, download and copy across the GPU firmware and bootloader files (start*.elf, fixup*.dat and bootcode.bin). See the instructions [[https://wiki.ubuntu.com/ARM/RaspberryPi#Updating_the_Pi_GPU_firmware_and_bootloader_files|above.]]

== Compile U-boot ==
Ubuntu includes an ARM cross compiler than can be used to compile [[https://elinux.org/RPi_U-Boot|U-boot for the RPi]]:
{{{
sudo apt install git make gcc gcc-aarch64-linux-gnu
git clone --depth 1 git://git.denx.de/u-boot.git
cd u-boot
make rpi_3_defconfig
make CROSS_COMPILE=aarch64-linux-gnu-
}}}

Copy it to the partition:
{{{
sudo mount /dev/XXX1 /mnt
sudo cp u-boot.bin /mnt/kernel8.img
cd ..
}}}
Calling it kernel8.img means that 64-bit mode is automatically used.

== Copy the device tree blob ==
An optional stage is to provide a dtb file:
{{{
wget http://ports.ubuntu.com/dists/bionic/main/installer-arm64/current/images/device-tree/bcm2837-rpi-3-b.dtb
mkdir /mnt/dtb/broadcom/
sudo cp bcm2837-rpi-3-b.dtb /mnt/dtb/broadcom/
}}}

== Download the kernel and grub files ==
Some ISO images are missing the kernel/initrd and grub files. These can be downloaded from http://ports.ubuntu.com/dists/bionic/main/installer-arm64/current/images/cdrom/

== Copy the ISO contents to the FAT partition ==
You can use dd to burn the ISO to a separate USB flash drive, but if you don't have a spare flash drive, then you can combine the contents of the ISO with the bootloader files:
{{{
wget http://ports.ubuntu.com/dists/bionic/main/installer-arm64/current/images/netboot/mini.iso
mkdir /tmp/mini-iso
sudo mount -o loop mini.iso /tmp/mini-iso
sudo cp -rT /tmp/mini-iso /mnt
}}}
Note, if you are doing this via a graphical file manager then you must ensure you copy the hidden .disk folder.

Finally extract the bootaa64.efi file and copy it across:
{{{
mkdir /tmp/efi-img
sudo mount -o loop /tmp/mini-iso/boot/grub/efi.img /tmp/efi-img
sudo cp -rT /tmp/efi-img /mnt
sudo umount /tmp/efi-img
sudo umount /tmp/mini-iso
sudo umount /mnt
}}}

== Booting ==
Insert the device containing the bootloader files (plus the dd'd USB flash drive if that's what you've done) into the Raspberry Pi and power on!

Note, once you've made your selection via the grub menu, there is a long blank screen interval before the installer shows on the screen.

= Building Raspberry Pi 3 images =

To build a Raspberry Pi 3 image, you will need an armhf 18.04 LTS (bionic) build host (or chroot) and a fair amount of working space (at least 10GB).

Branch [[https://code.launchpad.net/~fo0bar/livecd-rootfs/raspi2-rpi3|lp:~fo0bar/livecd-rootfs/raspi2-rpi3]], build its .deb and install it.

As root:
{{{
apt-get install live-build
mkdir -p build/chroot
cd build
cp -a /usr/share/livecd-rootfs/live-build/auto .
export ARCH=armhf
export SUITE=xenial # or bionic
# export MIRROR=http://deb-proxy.local/ubuntu-ports # if you have a local caching proxy
export IMAGEFORMAT=ext4
export SUBARCH=raspi3
export PROJECT=ubuntu-cpc
export EXTRA_PPAS="ubuntu-raspi2/ppa-rpi3"
lb config
lb build
}}}

= Ubuntu 14.04 LTS =
Line 12: Line 336:
/!\ This is a community-maintained image, and is not supported by Ubuntu. The 3.13 kernel has been replaced with an updated 3.18 kernel which is not guaranteed to receive security updates the same as the LTS kernel provides. /!\

=== Download ===

 * [[http://www.finnie.org/software/raspberrypi/2015-02-19-ubuntu-trusty.zip|Download 2015-02-19-ubuntu-trusty.zip]] ([[http://www.finnie.org/software/raspberrypi/2015-02-19-ubuntu-trusty.zip.asc|GPG signature]])
 * 141MiB ZIP, 1.75GiB uncompressed image
/!\ This image, along with the one-off kernel it installs, is no longer maintained. Please use the 16.04 Xenial image instead. /!\

== Download ==

 * [[http://www.finnie.org/software/raspberrypi/2015-04-06-ubuntu-trusty.zip|Download 2015-04-06-ubuntu-trusty.zip]] ([[http://www.finnie.org/software/raspberrypi/2015-04-06-ubuntu-trusty.zip.asc|GPG signature]])
 * 152MiB ZIP, 1.75GiB uncompressed image
Line 19: Line 343:

If you downloaded an older image than the current one above, you shouldn't need to reinstall, but be sure to review the changelog below.

=== Installation ===

Installation is the same as other Raspberry Pi images; [[http://www.raspberrypi.org/documentation/installation/installing-images/README.md|a generic installation guide from raspberrypi.org is available here]].

Additionally, the distribution .zip includes a .bmap file. If you are installing to the SD card from Linux, you may use the [[http://packages.ubuntu.com/bmap-tools|bmap-tools]] package to save some time by writing only the non-zero blocks.
{{{
$ sudo bmaptool copy --bmap ubuntu-trusty.bmap ubuntu-trusty.img /dev/sdX
}}}

=== Usage ===

 * There are no Raspbian-specific utilities included, specifically no automatic root resizer. However, it's not hard to do manually. Once booted:
 * Raspberry Pi 3 images are not available.

== Usage ==

=== Root resize ===
There are no Raspbian-specific utilities included, specifically no automatic root resizer. However, it's not hard to do manually. Once booted:
Line 42: Line 357:
 * There is no swap partition/file included. If you want swap, it's recommended you do: === Swap ===
There is no swap partition/file included. If you want swap, it's recommended you do:
Line 48: Line 364:
 * This is a minimal ubuntu-standard image. If you want a full desktop, go ahead and do so:
{{{
$ sudo apt-get install lubuntu-desktop # or
$ sudo apt-get install xubuntu-desktop # etc
}}}

 * If you would like to install an SSH server for remote access:
=== Wifi firmware ===
If you are using a wifi dongle, you will likely need to get the linux-firmware package:
{{{
$ sudo apt-get install linux-firmware
}}}

=== SSH server ===
If you would like to install an SSH server for remote access:
Line 59: Line 376:
=== Building === === Serial console ===
To enable the serial console, change the /boot/cmdline.txt as follows:
{{{
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootwait
}}}
and add a new file /etc/init/ttyAMA0.conf:
{{{
start on stopped rc or RUNLEVEL=[12345]
stop on runlevel [!12345]

respawn
exec /sbin/getty -L 115200 ttyAMA0 vt102
}}}

== Kernel ==

The kernel used by the Raspberry Pi 2 port is an Ubuntu-style kernel package of an "rpi2" flavor, e.g. linux-image-3.18.0-20-rpi2. Currently it is comprised of the following functionality:

 * Mainline 3.18.x
 * Fork of [[http://kernel.ubuntu.com/git/ubuntu/ubuntu-vivid.git/log/?qt=range&q=f8e80fa0d166ec8df70d769d0e679fed5d93add1|Ubuntu-3.18.0-14.15 from the ubuntu-vivid git tree]]
  * Provides extra functionality such as aufs
  * Also includes additional stability fixes, many of which have been rolled into mainline post-3.18.7
 * Raspberry Pi-specific patches from the [[https://github.com/raspberrypi/linux/tree/rpi-3.18.y-rebase|rpi-3.18.y branch of Raspberry Pi's linux git tree]]

Ubuntu's 3.18 development is no longer active, as they moved on to 3.19 to be released with 15.04 vivid. However, mainline 3.18 was designated an LTS kernel release, and is still getting active security/stability updates. Because of this, 3.18 will likely remain the "supported" kernel of this port. (Again, this is an unofficial port and no support guarantee is implied.)

== Building ==
Line 63: Line 406:
=== Links ===

 * [[http://www.raspberrypi.org/forums/viewtopic.php?f=56&t=100553&p=701472|raspberrypi.org forums thread]]
If you want to build an image on your x86 Ubuntu host, install qemu-user-static package and edit the script to use "qemu-debootstrap --arch armhf" instead of "debootstrap":
{{{
qemu-debootstrap --arch armhf $RELEASE $R http://ports.ubuntu.com/
}}}

== Cross-upgrading 14.04 to 16.04 ==

You can upgrade an old unofficial 14.04 installation to the official 16.04 installation, though it takes a number of additional steps.

Note that Ubuntu's setup uses u-boot as an intermediary bootloader, which is different from the previous system of the RPI2 booting the kernel directly. This will be reflected in the upgrade procedure.

/!\ Once you begin this procedure, if you reboot the installation without completing the entire upgrade procedure, you will be left with an unbootable system. /!\

First, remove a number of PPA packages which are obsoleted / incompatible with the 16.04.
{{{
apt-get --purge remove rpi2-ubuntu-errata raspberrypi-bootloader-nokernel \
  linux-image-rpi2 flash-kernel
}}}

Back up and remove the apt PPA configuration and module blacklists (the latter will be provided directly by the 4.4.0 kernel package).
{{{
mkdir -p /root/xenial-upgrade
tar zcvf /root/xenial-upgrade/etc.tar.gz \
  /etc/modprobe.d/rpi2.conf \
  /lib/modules-load.d/rpi2.conf \
  /etc/apt/preferences.d/rpi2-ppa \
  /etc/apt/sources.list.d/fo0bar-rpi2* \
  /etc/apt/trusted.gpg.d/fo0bar-rpi2*
rm -f \
  /etc/modprobe.d/rpi2.conf \
  /lib/modules-load.d/rpi2.conf \
  /etc/apt/preferences.d/rpi2-ppa \
  /etc/apt/sources.list.d/fo0bar-rpi2* \
  /etc/apt/trusted.gpg.d/fo0bar-rpi2*
}}}

Back up and remove the contents of /boot/firmware, which will be recreated.
{{{
tar zcvf /root/xenial-upgrade/firmware.tar.gz /boot/firmware/*
rm -rf /boot/firmware/*
}}}

Update apt sources without the old PPA configuration.
{{{
apt-get update
}}}

Run do-release-upgrade as normal. When asked to reboot at the end, '''do not''', and select "n" instead.
{{{
do-release-upgrade -d
# -d will be unneeded once 16.04.1 is released
}}}

Install new firmware, u-boot and 4.4.0 kernel metapackages.
{{{
apt-get install u-boot-rpi u-boot-tools linux-raspi2 linux-firmware-raspi2 \
  linux-firmware flash-kernel
}}}

Install the RPI2 DT-compatible u-boot image.
{{{
apt-get install binutils # for "strings"
wget -O /tmp/mkknlimg https://raw.githubusercontent.com/raspberrypi/linux/rpi-4.4.y/scripts/mkknlimg
chmod 0755 /tmp/mkknlimg
/tmp/mkknlimg --dtok /usr/lib/u-boot/rpi_2/u-boot.bin /boot/firmware/uboot.bin
}}}

Install basic config.txt and cmdline.txt configurations. If your root device is not on the second SD partition (uncommon) or you have a more advanced configuration, recreate them here.
{{{
cat <<"EOM" >/boot/firmware/config.txt
kernel=uboot.bin
dtparam=i2c_arm=on
dtparam=spi=on
EOM

cat <<"EOM" >/boot/firmware/cmdline.txt
net.ifnames=0 dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
EOM
}}}

Update the initrd and re-flash the kernel configuration.
{{{
update-initramfs -u
flash-kernel
}}}

Reboot!
{{{
reboot
}}}

Optionally add ppa:ubuntu-raspi2/ppa as described above.

== Links ==

 * [[https://www.raspberrypi.org/forums/viewtopic.php?f=56&t=100553|raspberrypi.org forums thread]]
Line 68: Line 504:

=== Changelog ===

'''2015-02-19'''

If you installed the 2015-02-17 image, you don't need to reinstall this image, but you should remove /var/lib/dbus/machine-id and reboot.

 * Updated Ubuntu / kernel packages
 * Default apt-src repositories are now commented out
 * Installed language-pack-en package
 * Sound driver (snd_bcm2835) now loaded by default
 * Created legacy /boot/config.txt and /boot/cmdline.txt symlinks as these live in /boot/firmware
 * Cleaned up /etc/hosts formatting
 * Renamed ubuntu user GECOS from "Ubuntu" to "Ubuntu user"
 * Removed variant /var/lib/dbus/machine-id (will be regenerated on first boot)
 * Removed console=ttyAMA0,115200 from default cmdline.txt (interferes with non-console use of the serial port)

''' 2015-02-17 '''

 * Initial release

== Snappy Ubuntu Core ==

[[http://developer.ubuntu.com/en/snappy/|Snappy Ubuntu Core]] is a new rendition of Ubuntu with transactional updates - a minimal server image with the same libraries as today’s Ubuntu, but applications are provided through a simpler mechanism. [[https://insights.ubuntu.com/2015/02/02/snappy-ubuntu-core-on-raspberry-pi-2/|A developer preview is available]] for the Raspberry Pi 2.
 * PPAs:
  * [[https://launchpad.net/~fo0bar/+archive/ubuntu/rpi2/|ppa:fo0bar/rpi2]] - Stable packages (enabled in the default image)
  * [[https://launchpad.net/~fo0bar/+archive/ubuntu/rpi2-staging/|ppa:fo0bar/rpi2-staging]] - Staging builds
  * [[https://launchpad.net/~fo0bar/+archive/ubuntu/rpi2-nightly/|ppa:fo0bar/rpi2-nightly]] - Nightly automatic builds of some packages

With the release of the Raspberry Pi 2 Model B and its ARMv7-based BCM2709 processor, it is now possible to run Ubuntu directly on the Raspberry Pi.

Note that the information on this page currently only applies to the Raspberry Pi 2 and 3B/3B+, not the original Raspberry Pi.

Snappy Ubuntu Core

Snappy Ubuntu Core is a new rendition of Ubuntu with transactional updates - a minimal server image with the same libraries as today’s Ubuntu, but applications are provided through a simpler mechanism. Images are available for the Raspberry Pi 2 and 3.

Ubuntu 'classic'

Download

These are not Ubuntu Core images, but the 'classic' deb based image. The Raspberry Pi 3 does not (yet) work with official Ubuntu images out of the box, but unofficial images are available.

Official images

armhf

arm64

  • The generic arm64 ISO images can be used with the Raspberry Pi 3. Instructions for booting these are below.

Unofficial images

These Raspberry Pi 3 images are built by Ryan Finnie using modified packages in a PPA (ppa:ubuntu-raspi2/ppa-rpi3), and are not supported directly by Canonical.

Raspberry Pi 3 B+ (2018) functionality is not yet available with these images.

Installation

Installation is the same as other Raspberry Pi images; a generic installation guide from raspberrypi.org is available here.

Warning /!\ WARNING: These commands have the potential to wipe your hard drive! Warning /!\

For example:

xzcat ubuntu.img.xz | sudo dd bs=4M of=/dev/mmcblk0

Or using ddrescue (must decompress the image first):

unxz ubuntu.img.xz
sudo ddrescue -D -d --force ubuntu.img /dev/mmcblk0

Username/Password

On the server images the login username is "ubuntu", password is "ubuntu". You will be asked to change the password on first login.

Optional PPAs

While the official image includes compatible firmware, bootloader and kernel, there are a few packages available in an unofficial PPA (ppa:ubuntu-raspi2/ppa) which are useful on the Raspberry Pi, including:

  • libraspberrypi-bin - VideoCore utilities from https://github.com/raspberrypi/userland such as vcgencmd, raspistill, etc.

  • libraspberrypi-bin-nonfree - Binary VideoCore utilities not provided in the open source userland repository, currently vcdbg and edidparser.

  • xserver-xorg-video-fbturbo - An accelerated x.org video driver, though this is limited to hardware accelerated window moving/scrolling on the Raspberry Pi.

  • hello-dkms - Not strictly to do with the Raspberry Pi, but a small example DKMS project to test building kernel DKMS modules.

To install:

sudo add-apt-repository ppa:ubuntu-raspi2/ppa
sudo apt-get update

Further Raspberry Pi packages can be found in the Ubuntu Pi Flavour Maker PPA.

Desktop

This is a small ubuntu-server image. If you want a full desktop, go ahead and do so:

$ sudo apt-get install xubuntu-desktop  # or
$ sudo apt-get install lubuntu-desktop  # or
$ sudo apt-get install kubuntu-desktop  # etc

Ubuntu (Unity) and Ubuntu-GNOME just display a blank screen, presumably because they require 3D compositing. Kubuntu works but is slow unless you turn off desktop effects under System Settings. Xubuntu and Lubuntu work fine out of the box.

Tasks can be installed and removed with Tasksel.

Accelerated X driver

An accelerated x.org video driver is available (fbturbo), though this is limited to hardware accelerated window moving/scrolling on the Raspberry Pi. Install the optional PPA above, then:

$ sudo apt-get install xserver-xorg-video-fbturbo

Then add this to /etc/X11/xorg.conf (create if it doesn't already exist):

Section "Device"
    Identifier "Raspberry Pi FBDEV"
    Driver "fbturbo"
    Option "fbdev" "/dev/fb0"
    Option "SwapbuffersWait" "true"
EndSection

VideoCore

As with Raspbian, VideoCore packages are available. Install the optional PPA above, then:

$ sudo apt-get install libraspberrypi-bin libraspberrypi-dev

However, since these packages are compiled from source during build, the files are installed in their "proper" locations in /usr. Some third-party scripts may expect e.g. /opt/vc/bin/vcgencmd; if so, this hack should do it:

$ sudo ln -s /usr /opt/vc

(Raspbian packages use precompiled repositories during build, which install in /opt/vc.) vcdbg and edidparser are not part of the open source package and must be installed separately:

$ sudo apt-get install libraspberrypi-bin-nonfree

Booting the official Pi 2 image on the Pi 3B/3B+

The official Ubuntu images use u-boot as the bootloader. The u-boot binary built for the Pi 2 does not work on the Pi 3 and this is why there are separate images for the Pi 2 and Pi 3. However, the Raspberry Pi has its own built in bootloader. This can be used with a few changes to the config.txt file on the system-boot partition.

Write the image to an SD card as normal, but before you insert it into the Pi mount the two partitions so that you can make changes. Open the config.txt on the first partition (labelled system-boot). Change the kernel line, add an initramfs line, and comment out (#) the device_tree_address line as follows:

kernel=vmlinuz
initramfs initrd.img followkernel
#device_tree_address=0x02000000

Now copy the dtb file for your machine (e.g. bcm2710-rpi-3-b.dtb) plus the overlay folder if needed from /lib/firmware/4.X.X-XXXX-raspi2/device-tree to the system-boot partition.

For the Pi 3B+ you will also have to update the Pi bootloader files (bootcode.bin, fixup.dat and start.elf) on the system-boot partition.

Place the SD card in your Pi and turn on!

If your new machine is missing from the flash-kernel database ("unsupported platform" error message when you update the kernel) then add an entry to /etc/flash-kernel/db. The full database can be found at /usr/share/flash-kernel/db/all.db. For the Machine field use the output of:

cat /proc/device-tree/model ; echo

If you need to manually copy across the kernel and initrd files (note, the system-boot partition is mounted at /boot/firmware):

sudo cp /boot/vmlinuz /boot/firmware/
sudo cp /boot/initrd.img /boot/firmware/

USB booting

The Raspberry Pi 3 (and Pi 2 v1.2 with the same BCM2837 SoC as the Pi3) is capable of booting from a USB drive. To do this you'll first need to program USB boot mode (this is unnecessary on the 3B+ as USB booting is on by default).

You must have bootloader files (confusingly referred to as the firmware on the Raspberry Pi) from after April 2017. So grab the latest bootcode.bin, fixup.dat and start.elf and copy them to your system-boot partition.

Edit the cmdline.txt file

sudo nano /boot/firmware/cmdline.txt

and change root=/dev/mmcblk0p2 to root=LABEL=cloudimg-rootfs

If you are using a lot of drives then you may wish to switch to using the UUID of the partition.

WiFi

The built-in WiFi on the Pi 3B and 3B+ requires some updated/extra files:

mkdir wifi-firmware
cd wifi-firmware
# Pi 3B
wget https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm/brcmfmac43430-sdio.bin
wget https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm/brcmfmac43430-sdio.txt
# Pi 3B+
wget https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm/brcmfmac43455-sdio.bin
wget https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm/brcmfmac43455-sdio.clm_blob
wget https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm/brcmfmac43455-sdio.txt 
sudo cp *sdio* /lib/firmware/brcm/
cd ..

Reboot the machine.

Use dpkg-divert to stop these files being overwritten on package updates.

Updating the Pi GPU firmware and bootloader files

Currently (26/4/2018) Ubuntu 18.04 ships with old copies of the GPU firmware and bootloader files (start*.elf, fixup*.dat and bootcode.bin). Consequently features like USB booting and machines like the Pi 3B+ do not work out of the box.

The very latest files can be found at https://github.com/raspberrypi/firmware, but releases can also be downloaded from http://archive.raspberrypi.org:

wget http://archive.raspberrypi.org/debian/pool/main/r/raspberrypi-firmware/raspberrypi-bootloader_1.20180417-1_armhf.deb
dpkg-deb -x raspberrypi-bootloader_1.20180417-1_armhf.deb /tmp/pi-bootloader

If you are doing this on an installed system, remove the linux-firmware-raspi2 package before copying the new files to the system-boot partition:

sudo apt remove linux-firmware-raspi2
sudo cp /tmp/pi-bootloader/boot/* /boot/firmware/

If you are preparing an SD card on another machine, then mount the FAT formatted system-boot partition and copy the files across

sudo mount /dev/XXX1 /mnt
sudo cp /tmp/pi-bootloader/boot/* /mnt

Ubuntu arm64/AArch64

'arm64' is the Debian port name for the 64-bit ARMv8 architecture, referred to as 'aarch64' in upstream toolchains (GNU triplet aarch64-linux-gnu), and some other distros.

BCM2837 is the chip used in the Raspberry Pi 3 and in later models of the Raspberry Pi 2. It packages a 64-bit quad-core ARM Cortex A53 (ARMv8) CPU with VideoCore IV GPU.

There is a config.txt entry to make the ARM start in 64-mode (otherwise 32-bit mode is used):

arm_control=0x200

(This will fail to boot unless you provide a kernel compiled for 64-bit mode)

64 bit versions of the linux-raspi2 kernels were introduced in Ubuntu 16.10 (Yakkety Yak).

Multiarch

To set up MultiArch:

sudo dpkg --add-architecture arm64 
sudo apt update

Install the 64 bit kernel:

sudo apt install linux-image-raspi2:arm64

Install any other packages you want e.g. to run 64-bit Firefox:

sudo apt install firefox:arm64

Reboot

Booting generic arm64 ISO images

The generic arm64 linux kernels can also be used with a suitable bootloader. For example, the Bionic mini.iso and ubuntu-18.04-server-arm64.iso can be booted with a u-boot-UEFI-grub2 combination. This can be achieved as follows:

Create a partition with pi firmware/bootloader files

The Raspberry Pi's bootloader, built into the GPU and non-updateable, only has support for reading from FAT filesystems (both FAT16 and FAT32). So the first step is to create a partition on a SD card or USB device and format it as FAT.

Next, download and copy across the GPU firmware and bootloader files (start*.elf, fixup*.dat and bootcode.bin). See the instructions above.

Compile U-boot

Ubuntu includes an ARM cross compiler than can be used to compile U-boot for the RPi:

sudo apt install git make gcc gcc-aarch64-linux-gnu
git clone --depth 1 git://git.denx.de/u-boot.git
cd u-boot
make rpi_3_defconfig
make CROSS_COMPILE=aarch64-linux-gnu-

Copy it to the partition:

sudo mount /dev/XXX1 /mnt
sudo cp u-boot.bin /mnt/kernel8.img
cd ..

Calling it kernel8.img means that 64-bit mode is automatically used.

Copy the device tree blob

An optional stage is to provide a dtb file:

wget http://ports.ubuntu.com/dists/bionic/main/installer-arm64/current/images/device-tree/bcm2837-rpi-3-b.dtb
mkdir /mnt/dtb/broadcom/
sudo cp bcm2837-rpi-3-b.dtb /mnt/dtb/broadcom/

Download the kernel and grub files

Some ISO images are missing the kernel/initrd and grub files. These can be downloaded from http://ports.ubuntu.com/dists/bionic/main/installer-arm64/current/images/cdrom/

Copy the ISO contents to the FAT partition

You can use dd to burn the ISO to a separate USB flash drive, but if you don't have a spare flash drive, then you can combine the contents of the ISO with the bootloader files:

wget http://ports.ubuntu.com/dists/bionic/main/installer-arm64/current/images/netboot/mini.iso
mkdir /tmp/mini-iso
sudo mount -o loop mini.iso /tmp/mini-iso
sudo cp -rT /tmp/mini-iso /mnt

Note, if you are doing this via a graphical file manager then you must ensure you copy the hidden .disk folder.

Finally extract the bootaa64.efi file and copy it across:

mkdir /tmp/efi-img
sudo mount -o loop /tmp/mini-iso/boot/grub/efi.img /tmp/efi-img
sudo cp -rT /tmp/efi-img /mnt
sudo umount /tmp/efi-img
sudo umount /tmp/mini-iso
sudo umount /mnt

Booting

Insert the device containing the bootloader files (plus the dd'd USB flash drive if that's what you've done) into the Raspberry Pi and power on!

Note, once you've made your selection via the grub menu, there is a long blank screen interval before the installer shows on the screen.

Building Raspberry Pi 3 images

To build a Raspberry Pi 3 image, you will need an armhf 18.04 LTS (bionic) build host (or chroot) and a fair amount of working space (at least 10GB).

Branch lp:~fo0bar/livecd-rootfs/raspi2-rpi3, build its .deb and install it.

As root:

apt-get install live-build
mkdir -p build/chroot
cd build
cp -a /usr/share/livecd-rootfs/live-build/auto .
export ARCH=armhf
export SUITE=xenial  # or bionic
# export MIRROR=http://deb-proxy.local/ubuntu-ports  # if you have a local caching proxy
export IMAGEFORMAT=ext4
export SUBARCH=raspi3
export PROJECT=ubuntu-cpc
export EXTRA_PPAS="ubuntu-raspi2/ppa-rpi3"
lb config
lb build

Ubuntu 14.04 LTS

An Ubuntu 14.04 LTS (Trusty Tahr) image is available for the Raspberry Pi 2, which combines the released 14.04 distribution with a PPA containing kernels and firmware which work on the Raspberry Pi 2.

Warning /!\ This image, along with the one-off kernel it installs, is no longer maintained. Please use the 16.04 Xenial image instead. Warning /!\

Download

Usage

Root resize

There are no Raspbian-specific utilities included, specifically no automatic root resizer. However, it's not hard to do manually. Once booted:

$ sudo fdisk /dev/mmcblk0

Delete the second partition (d, 2), then re-create it using the defaults (n, p, 2, enter, enter), then write and exit (w). Reboot the system, then:

$ sudo resize2fs /dev/mmcblk0p2

Swap

There is no swap partition/file included. If you want swap, it's recommended you do:

$ sudo apt-get install dphys-swapfile

You should have a (resized) SD card at least 4GB, because by default it will want to create a ~2GB swapfile.

Wifi firmware

If you are using a wifi dongle, you will likely need to get the linux-firmware package:

$ sudo apt-get install linux-firmware

SSH server

If you would like to install an SSH server for remote access:

$ sudo apt-get install openssh-server

Serial console

To enable the serial console, change the /boot/cmdline.txt as follows:

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootwait

and add a new file /etc/init/ttyAMA0.conf:

start on stopped rc or RUNLEVEL=[12345]
stop on runlevel [!12345]

respawn
exec /sbin/getty -L 115200 ttyAMA0 vt102

Kernel

The kernel used by the Raspberry Pi 2 port is an Ubuntu-style kernel package of an "rpi2" flavor, e.g. linux-image-3.18.0-20-rpi2. Currently it is comprised of the following functionality:

Ubuntu's 3.18 development is no longer active, as they moved on to 3.19 to be released with 15.04 vivid. However, mainline 3.18 was designated an LTS kernel release, and is still getting active security/stability updates. Because of this, 3.18 will likely remain the "supported" kernel of this port. (Again, this is an unofficial port and no support guarantee is implied.)

Building

  • The script used to build the images is available here.

If you want to build an image on your x86 Ubuntu host, install qemu-user-static package and edit the script to use "qemu-debootstrap --arch armhf" instead of "debootstrap":

qemu-debootstrap --arch armhf $RELEASE $R http://ports.ubuntu.com/

Cross-upgrading 14.04 to 16.04

You can upgrade an old unofficial 14.04 installation to the official 16.04 installation, though it takes a number of additional steps.

Note that Ubuntu's setup uses u-boot as an intermediary bootloader, which is different from the previous system of the RPI2 booting the kernel directly. This will be reflected in the upgrade procedure.

Warning /!\ Once you begin this procedure, if you reboot the installation without completing the entire upgrade procedure, you will be left with an unbootable system. Warning /!\

First, remove a number of PPA packages which are obsoleted / incompatible with the 16.04.

apt-get --purge remove rpi2-ubuntu-errata raspberrypi-bootloader-nokernel \
  linux-image-rpi2 flash-kernel

Back up and remove the apt PPA configuration and module blacklists (the latter will be provided directly by the 4.4.0 kernel package).

mkdir -p /root/xenial-upgrade
tar zcvf /root/xenial-upgrade/etc.tar.gz \
  /etc/modprobe.d/rpi2.conf \
  /lib/modules-load.d/rpi2.conf \
  /etc/apt/preferences.d/rpi2-ppa \
  /etc/apt/sources.list.d/fo0bar-rpi2* \
  /etc/apt/trusted.gpg.d/fo0bar-rpi2*
rm -f \
  /etc/modprobe.d/rpi2.conf \
  /lib/modules-load.d/rpi2.conf \
  /etc/apt/preferences.d/rpi2-ppa \
  /etc/apt/sources.list.d/fo0bar-rpi2* \
  /etc/apt/trusted.gpg.d/fo0bar-rpi2*

Back up and remove the contents of /boot/firmware, which will be recreated.

tar zcvf /root/xenial-upgrade/firmware.tar.gz /boot/firmware/*
rm -rf /boot/firmware/*

Update apt sources without the old PPA configuration.

apt-get update

Run do-release-upgrade as normal. When asked to reboot at the end, do not, and select "n" instead.

do-release-upgrade -d
# -d will be unneeded once 16.04.1 is released

Install new firmware, u-boot and 4.4.0 kernel metapackages.

apt-get install u-boot-rpi u-boot-tools linux-raspi2 linux-firmware-raspi2 \
  linux-firmware flash-kernel

Install the RPI2 DT-compatible u-boot image.

apt-get install binutils  # for "strings"
wget -O /tmp/mkknlimg https://raw.githubusercontent.com/raspberrypi/linux/rpi-4.4.y/scripts/mkknlimg
chmod 0755 /tmp/mkknlimg 
/tmp/mkknlimg --dtok /usr/lib/u-boot/rpi_2/u-boot.bin /boot/firmware/uboot.bin

Install basic config.txt and cmdline.txt configurations. If your root device is not on the second SD partition (uncommon) or you have a more advanced configuration, recreate them here.

cat <<"EOM" >/boot/firmware/config.txt
kernel=uboot.bin
dtparam=i2c_arm=on
dtparam=spi=on
EOM

cat <<"EOM" >/boot/firmware/cmdline.txt
net.ifnames=0 dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
EOM

Update the initrd and re-flash the kernel configuration.

update-initramfs -u
flash-kernel

Reboot!

reboot

Optionally add ppa:ubuntu-raspi2/ppa as described above.

ARM/RaspberryPi (last edited 2020-10-29 13:18:04 by peterm-ubuntu)