Mailinglist Archive: opensuse-arm (170 mails)

< Previous Next >
[opensuse-arm] Turris Omnia (prototype) enablement report
Hello,

This weekend I've had the opportunity to test openSUSE on a prototype of
CZ.NIC's Indiegogo-funded Turris Omnia router [1].

In a FOSDEM 2016 talk a prototype had already been shown to the public,
whereas this was the first time we could peek at the current software
environment of a running prototype ourselves and provide some early
third-party distro feedback to its creators.

Known for being overly critical and aiming at perfect solutions, let me
say in advance that the Armada 385 mainline kernel support looks quite
good already, needing only the Turris Omnia Device Tree [2] apparently.
Turris Omnia's U-Boot [3] is quite usable but will need a little more
love before we can benefit from new features such as UEFI boot support
(both upstream where it's not yet using the distro defaults [4] and
downstream for deriving a clean new turris_omnia_defconfig).
I'm confident that most of the functional limitations I observed can be
fixed until the final board version ships to backers.

That said, here's a quick how-to I would've added to the Wiki [1] if it
let me...

== Manual installation ==

As of 2016-03-18, the prototype's U-Boot does not yet support XHCI, so
that the two USB ports cannot be used for booting.
That leaves eMMC and mSATA as local boot options.

=== Building an upstream kernel ===

Use mvebu_v7_defconfig and enable CONFIG_BTRFS_FS.

=== Installation to USB ===

As of 2016-03-18, the prototype's U-Boot does not yet support XHCI and
therefore does not recognize any USB devices on either of the two USB ports.
Still you can place your rootfs onto USB.

As of 2016-03-18, the prototype's kernel has USB drivers built as
modules and no initrd, so you cannot directly boot a USB rootfs with it.
An easy solution is to build an upstream kernel yourself with those
drivers built-in and to copy it to the eMMC's /boot directory (e.g.,
zImage-next).

Note: In linux-next.git next-20160318 kernel only USB 3.0 devices work.

Partition your USB disk with GPT or MBR. Create a partition for the
rootfs and extract an
[http://download.opensuse.org/ports/armv7hl/tumbleweed/images/openSUSE-Tumbleweed-ARM-JeOS.armv7-rootfs.armv7l-Current.tbz
openSUSE-Tumbleweed-JeOS.armv7-rootfs.armv7l-Current.tbz] tarball.
Then boot similar to this (derived from bootargs and mmcboot variables):

setenv bootargs 'console=ttyS0,115200 root=/dev/sda1 rootfstype=ext4
rootwait rw'
btrload mmc 0 0x01000000 boot/zImage-next @
btrload mmc 0 0x02000000 boot/dtb @
bootz 0x01000000 - 0x02000000

Note: As always, "/dev/sda1" is unsafe as it may become, e.g., /dev/sdb1
when an mSATA SSD or a second USB storage device is connected.

You could save those commands in a U-Boot environment variable,
otherwise you will need to re-type them on each boot.

=== Installation to mSATA ===

Unless you have another device with mSATA port, you may find it
difficult to set up the SSD.

As of 2016-03-18, the prototype's OpenWrt kernel did not recognize a
Samsung SSD 850 EVO 120 GB mSATA card (while U-Boot's scsi scan does).
As workaround you can compile an upstream kernel (cf.
[[#Building_an_upstrea_kernel|above]]), copy it under a new name to
/boot on the eMMC (e.g., zImage-next) and boot OpenWrt with this new
kernel (derived from mmcboot variable):

btrload mmc 0 0x01000000 boot/zImage-next @
btrload mmc 0 0x02000000 boot/dtb @
bootz 0x01000000 - 0x02000000

Now that you have a /dev/sda device for the mSATA SSD, you may find that
OpenWrt does not come with parted, fdisk or gdisk tools for partitioning
this device.

One solution is to boot into openSUSE Tumbleweed, where you can easily
install those tools, from USB (cf. [[#Installation_to_USB|above]]):

setenv bootargs 'console=ttyS0,115200 root=/dev/sdb1 rootfstype=ext4
rootwait rw'
btrload mmc 0 0x01000000 boot/zImage-next @
btrload mmc 0 0x02000000 boot/dtb @
bootz 0x01000000 - 0x02000000

From inside openSUSE verify that /dev/sda is your mSATA card and
partition it using gdisk (zypper in gptfdisk). Format your new partition
and extract a JeOS rootfs tarball. For now just copy zImage-next and dtb
over.

mount /dev/sda1 /mnt
tar xvjf
[http://download.opensuse.org/ports/armv7hl/tumbleweed/images/openSUSE-Tumbleweed-ARM-JeOS.armv7-rootfs.armv7l-Current.tbz
openSUSE-Tumbleweed-JeOS.armv7-rootfs.armv7l-XXX.tbz] -C /mnt
cp /boot/zImage-next /mnt/boot/zImage-next
cp /boot/dtb /mnt/boot/armada-385-turris-omnia.dtb
ln -sf zImage-next /mnt/boot/zImage
ln -sf armada-385-turris-omnia.dtb /mnt/boot/dtb

Boot similar to this:

setenv bootargs 'console=ttyS0,115200 root=/dev/sda1 rootfstype=btrfs
rootwait rw'
setenv fdtfile armada-385-turris-omnia.dtb
scsi scan
btrload scsi 0:1 0x01000000 boot/zImage-next
btrload scsi 0:1 0x02000000 boot/dtb/$fdtfile
bootz 0x01000000 - 0x02000000

It's beginning to look much more like openSUSE, just lacking an openSUSE
kernel still.

=== Installation to eMMC ===

In theory you can also replace OpenWrt with openSUSE, optionally backing
it up as btrfs snapshot.
To do so you'll need to boot from some other root device such as USB or
mSATA.

mount /dev/mmcblk0p1 /mnt
btrfs subvolume snapshot /mnt/@ /mnt/root-pre-opensuse
rm -rf /mnt/@/*
tar xvjf
[http://download.opensuse.org/ports/armv7hl/tumbleweed/images/openSUSE-Tumbleweed-ARM-JeOS.armv7-rootfs.armv7l-Current.tbz
openSUSE-Tumbleweed-JeOS.armv7-rootfs.armv7l-XXX.tbz] -C /mnt/@
cp /boot/zImage-next /mnt/@/boot/zImage-next
cp /boot/dtb /mnt/@/boot/armada-385-turris-omnia.dtb
ln -sf zImage-next /mnt/@/boot/zImage
ln -sf armada-385-turris-omnia.dtb /mnt/@/boot/dtb

Then on next boot you should boot into openSUSE automatically.

=== openSUSE kernel ===

Unlike mvebu_v7_defconfig, the openSUSE kernels build drivers as modules
whenever possible.
To boot you will need additional driver modules in a ramdisk.
There's two easy ways to create such an initrd file. Either use Kiwi (as
done for our JeOS SD card images) or boot into the system once without
modules and have the initrd be created by dracut. If you zypper up or
zypper dup the system for the first time, chances are a new
kernel-default package gets installed and generates an initrd; you can
force this the easy way by reinstalling the package (zypper in -f
kernel-default) or figure out the lengthy dracut command line. Try to
boot it like this:

setenv bootargs 'console=ttyS0,115200 root=/dev/sda1 rootfstype=btrfs
rootwait rw'
scsi scan
btrload scsi 0:1 0x01000000 boot/zImage
btrload scsi 0:1 0x02000000 boot/dtb/armada-385-turris-omnia.dtb
btrload scsi 0:1 0x03000000 boot/initrd
bootz 0x01000000 0x03000000:$filesize 0x02000000

This resulted in:

Kernel image @ 0x1000000 [ 0x000000 - 0x6f2d78 ]
Wrong Ramdisk Image Format
Ramdisk image is corrupt or invalid

''To be investigated - U-Boot lacking CONFIG_SUPPORT_RAW_INITRD?''
This is blocking creation of a JeOS disk image.


Cheers,
Andreas

[1] https://en.opensuse.org/HCL:Turris_Omnia
[2]
https://gitlab.labs.nic.cz/turris/openwrt/tree/test/target/linux/mvebu/files/arch/arm/boot/dts
[3] https://gitlab.labs.nic.cz/turris/turris-omnia-uboot/commits/omnia
[4]
http://git.denx.de/?p=u-boot.git;a=blob;f=include/configs/db-88f6820-gp.h;h=ef14132b89ed685fb177b1cc2cc9be53b412232a;hb=HEAD

--
SUSE Linux GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Felix Imendörffer, Jane Smithard, Graham Norton; HRB 21284 (AG Nürnberg)
--
To unsubscribe, e-mail: opensuse-arm+unsubscribe@xxxxxxxxxxxx
To contact the owner, e-mail: opensuse-arm+owner@xxxxxxxxxxxx

< Previous Next >
This Thread
  • No further messages