Group: Hardware/FSDG distributions/Trisquel

From LibrePlanet
Jump to: navigation, search
(How to install Trisquel 10 (etiona) on ARM SBCs: fix kernel and initrd location)
(How to install Trisquel 10 (etiona) on 32bit ARM SBCs: clarify sentense.)
 
(22 intermediate revisions by 2 users not shown)
Line 8: Line 8:
 
! Kernel version
 
! Kernel version
 
! Comments
 
! Comments
 +
|-
 +
| Trisquel 11 (aramo)
 +
| {{yes}}
 +
| Ubuntu 22.04 LTS (Jammy Jellyfish)
 +
|
 +
* 5.15
 
|-
 
|-
 
| Trisquel 10 (nabia)
 
| Trisquel 10 (nabia)
Line 25: Line 31:
 
{{stub}}
 
{{stub}}
  
If you're doing that on Parabola, you need to enable etiona support:
+
This tutorial has been tested on Parabola x86_64, but it should work on Trisquel too as they both have similar qemu-user-static packages.
# cd /usr/share/debootstrap/scripts/
 
# ln -s trisquel etiona
 
  
Then you can install Trisquel as usual:
+
{| class="wikitable"  border="1"
 +
! Distribution
 +
! Package
 +
! Binary
 +
|-
 +
! Parabola
 +
| qemu-user-static
 +
| /usr/bin/qemu-arm-static
 +
|-
 +
! Trisquel 11.0 (aramo)
 +
| qemu-user-static
 +
| /usr/bin/qemu-arm-static
 +
|}
 +
 
 +
For Guix it was tested on Guix system with qemu:static but '/debootstrap/debootstrap --second-stage' didn't work without having the [https://guix.gnu.org/en/manual/devel/en/html_node/Virtualization-Services.html#Transparent-Emulation-with-QEMU Transparent Emulation with QEMU] enabled. Once enabled it worked fine. As for running Guix on top of Parabola with systemd, you need to install qemu-user-static-binfmt and enable systemd-binfmt.service like explained in the [https://wiki.parabola.nu/ARM_Installation_Guide#Prepare_your_host_system Parabola ARM installation guide] for it to work.
 +
 
 +
You can then start installing Trisquel on an ARM computer (from an x86 computer with Guix, Parabola or Trisquel) with the following commands:
 
  # qemu-img create -f raw storage.img 2G
 
  # qemu-img create -f raw storage.img 2G
  # fdisk storage.img # create 1 partition
+
  # echo 'start=2048,type=83' | sfdisk storage.img # This creates 1 partition.
 
  # udisksctl loop-setup -f storage.img
 
  # udisksctl loop-setup -f storage.img
 
  # mkdir rootfs
 
  # mkdir rootfs
Line 38: Line 58:
 
  # mkdir -p rootfs/usr/bin
 
  # mkdir -p rootfs/usr/bin
 
  # debootstrap --foreign --arch armhf etiona rootfs
 
  # debootstrap --foreign --arch armhf etiona rootfs
 +
 +
Then if you use Parabola or Trisquel, you need to run the following commands:
 
  # cp /usr/bin/qemu-arm-static rootfs/usr/bin
 
  # cp /usr/bin/qemu-arm-static rootfs/usr/bin
  # LANG=C.UTF-8 chroot rootfs qemu-arm-static /bin/bash
+
  # LANG=C.UTF-8 chroot rootfs /usr/bin/qemu-arm-static /bin/bash
 
  # export TERM=xterm-color
 
  # export TERM=xterm-color
 +
# export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
 +
# /debootstrap/debootstrap --second-stage
 +
 +
If you use Guix instead (either as system distribution or on top of another distribution) you can use the following commands instead:
 +
# sed 's#/gnu/store/.*/bin/sh#/bin/sh#g' -i rootfs/debootstrap/debootstrap
 +
# sed 's#/gnu/store/.*/bin/dpkg#/usr/bin/dpkg#g' -i rootfs/debootstrap/debootstrap
 +
# LANG=C.UTF-8 chroot rootfs /bin/bash
 +
# export TERM=xterm-color
 +
# export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
 
  # /debootstrap/debootstrap --second-stage
 
  # /debootstrap/debootstrap --second-stage
  
Line 51: Line 82:
 
         kernel /boot/vmlinuz
 
         kernel /boot/vmlinuz
 
         append loglevel=8 root=/dev/mmcblk0p1 rw
 
         append loglevel=8 root=/dev/mmcblk0p1 rw
         fdtdir /dtb/
+
         fdtdir /boot/dtb/
 
         initrd /boot/initrd.img
 
         initrd /boot/initrd.img
 +
 +
Set the first partition to be bootable (needed to be able to boot):
 +
# sfdisk /dev/loop0 -A 1
  
 
Then you need to install a kernel:
 
Then you need to install a kernel:
  # LANG=C.UTF-8 chroot rootfs qemu-arm-static /bin/bash
+
# for d in proc dev dev/pts sys ; do mount -o bind /$d rootfs/$d ; done
 +
  # LANG=C.UTF-8 chroot rootfs /usr/bin/qemu-arm-static /bin/bash
 
  # source /etc/environment
 
  # source /etc/environment
 
  # apt remove flash-kernel
 
  # apt remove flash-kernel
 
  # apt install linux-image-generic
 
  # apt install linux-image-generic
  
You then need to write a script in /etc/kernel/postinst.d/zz-generate-dtb-link to generate a symlink from /lib/firmware/<<your-kernel-version>>/device-tree/ to /dtb, so for instance from /lib/firmware/5.4.0-96-generic/device-tree/ to /dtb. I've an incomplete script here:
+
You then need to write a script in /etc/kernel/postinst.d/zz-generate-dtb-link to generate a symlink from /lib/firmware/<<your-kernel-version>>/device-tree/ to /boot/dtb, so for instance from /lib/firmware/5.4.0-96-generic/device-tree/ to /boot/dtb. I've an incomplete script here:
 
  #!/bin/sh
 
  #!/bin/sh
 
  set -e
 
  set -e
Line 66: Line 101:
 
  version="$1"
 
  version="$1"
 
   
 
   
  ln -sf /lib/firmware/${version}/device-tree/ /dtb
+
  ln -sf /lib/firmware/${version}/device-tree/ /boot/dtb
  
The caveat of this script is that it has not been tested with multiple kernel versions installed, so during apt upgrade, it may or may not make the /dtb link point to the wrong kernel. So that needs to be tested.
+
The caveat of this script is that it has not been tested with multiple kernel versions installed, so during apt upgrade, it may or may not make the /boot/dtb link point to the wrong kernel. So that needs to be tested.
  
 
With only one kernel installed it should not be a problem.
 
With only one kernel installed it should not be a problem.
  
 
In addition to that you will also need to make the symlink yourself the first time, before booting the image, like that:
 
In addition to that you will also need to make the symlink yourself the first time, before booting the image, like that:
  # LANG=C.UTF-8 chroot rootfs qemu-arm-static /bin/bash
+
  # LANG=C.UTF-8 chroot rootfs /usr/bin/qemu-arm-static /bin/bash
 
  # source /etc/environment
 
  # source /etc/environment
  # ln -sf /lib/firmware/<your-kernel-version>/device-tree/ /dtb
+
  # ln -sf /lib/firmware/<your-kernel-version>/device-tree/ /boot/dtb
 
You will need to replace the <your-kenrel-version> with your kenrel version, for instance:
 
You will need to replace the <your-kenrel-version> with your kenrel version, for instance:
  # LANG=C.UTF-8 chroot rootfs qemu-arm-static /bin/bash
+
  # LANG=C.UTF-8 chroot rootfs /usr/bin/qemu-arm-static /bin/bash
 
  # source /etc/environment
 
  # source /etc/environment
  # ln -sf /lib/firmware/5.4.0-96-generic/device-tree/ /dtb
+
  # ln -sf /lib/firmware/5.4.0-96-generic/device-tree/ /boot/dtb
  
You will then need to install a bootloader, here's an example for the beagleboard:
+
You will then need to install a bootloader, here's an example for the lime 1 A20:
  # LANG=C.UTF-8 chroot rootfs qemu-arm-static /bin/bash
+
  # LANG=C.UTF-8 chroot rootfs /usr/bin/qemu-arm-static /bin/bash
 
  # source /etc/environment
 
  # source /etc/environment
 
  # apt update
 
  # apt update
  # apt install u-boot-omap
+
  # apt install u-boot-sunxi
  # cat /usr/share/doc/u-boot-omap/README.Debian
+
  # cat /usr/share/doc/u-boot-sunxi/README.Debian
  # dd conv=fsync,notrunc seek=256 if=/usr/lib/u-boot/omap3_beagle/MLO of=/dev/loop0
+
  # dd conv=fsync,notrunc if=/usr/lib/u-boot/A20-OLinuXino-Lime/u of=/dev/loop0 bs=1024 seek=8
  # dd conv=fsync,notrunc seek=768 if=/usr/lib/u-boot/omap3_beagle/u-boot.img of=/dev/loop0
+
 
 +
You can then unmount and copy to a microSD:
 +
  # umount rootfs/dev/pts rootfs/dev rootfs/proc rootfs/sys rootfs/
 +
# ddrescue /dev/loop0 /dev/sdZ # copy to a microSD
 +
 
 +
== Failed installation With Trisquel 10 (nabia) ==
 +
 
 +
* Devices with an Allwiner SOCs: missing devicetree.
 +
* Devices with OMAP3 SOC: the package instructions / README use dd but u-boot.img is probably expected on a fat partition. And u-boot determine that due to some bug. See Parabola patches for more details. Tested with a beagleboard (probably one of the latest revisions) and MLO complained about not finding u-boot.img
 +
* On a Pandaboard, it booted the kernel, dtb and initramfs fine, but then the kernel hangs (there are too much backtraces to see where the issue comes from).
 +
* The TBS2910 is also supported by upstream u-boot but there I coudn't test since u-boot-img 2019.07+dfsg-1ubuntu6 doesn't have an image for it. Maybe support for DISTRO_BOOT was added upstream after that u-boot version.
  
 
== References ==
 
== References ==
 
<references/>
 
<references/>

Latest revision as of 17:18, 9 April 2024

Trisquel versions

Version Can be debootstrapped Based on Kernel version Comments
Trisquel 11 (aramo) Yes Ubuntu 22.04 LTS (Jammy Jellyfish)
  • 5.15
Trisquel 10 (nabia) Yes Ubuntu 20.04 LTS (Focal Fossa)
  • 5.4
  • 5.13 (though linux-image-generic-hwe-20.04)

Installing

How to install Trisquel 10 (etiona) on 32bit ARM SBCs

This tutorial has been tested on Parabola x86_64, but it should work on Trisquel too as they both have similar qemu-user-static packages.

Distribution Package Binary
Parabola qemu-user-static /usr/bin/qemu-arm-static
Trisquel 11.0 (aramo) qemu-user-static /usr/bin/qemu-arm-static

For Guix it was tested on Guix system with qemu:static but '/debootstrap/debootstrap --second-stage' didn't work without having the Transparent Emulation with QEMU enabled. Once enabled it worked fine. As for running Guix on top of Parabola with systemd, you need to install qemu-user-static-binfmt and enable systemd-binfmt.service like explained in the Parabola ARM installation guide for it to work.

You can then start installing Trisquel on an ARM computer (from an x86 computer with Guix, Parabola or Trisquel) with the following commands:

# qemu-img create -f raw storage.img 2G
# echo 'start=2048,type=83' | sfdisk storage.img # This creates 1 partition.
# udisksctl loop-setup -f storage.img
# mkdir rootfs
# mkfs.ext4 -O ^metadata_csum -O ^64bit /dev/loop0p1
# mount /dev/loop0p1 rootfs
# mkdir -p rootfs/usr/bin
# debootstrap --foreign --arch armhf etiona rootfs

Then if you use Parabola or Trisquel, you need to run the following commands:

# cp /usr/bin/qemu-arm-static rootfs/usr/bin
# LANG=C.UTF-8 chroot rootfs /usr/bin/qemu-arm-static /bin/bash
# export TERM=xterm-color
# export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# /debootstrap/debootstrap --second-stage

If you use Guix instead (either as system distribution or on top of another distribution) you can use the following commands instead:

# sed 's#/gnu/store/.*/bin/sh#/bin/sh#g' -i rootfs/debootstrap/debootstrap
# sed 's#/gnu/store/.*/bin/dpkg#/usr/bin/dpkg#g' -i rootfs/debootstrap/debootstrap
# LANG=C.UTF-8 chroot rootfs /bin/bash
# export TERM=xterm-color
# export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# /debootstrap/debootstrap --second-stage

You then need to create the extlinux.conf file in /boot/extlinux/extlinux.conf with the following content:

menu title Welcome to U-Boot with Extlinux support!

timeout 10

label Trisquel GNU/Linux-libre, linux-libre kernel
        kernel /boot/vmlinuz
        append loglevel=8 root=/dev/mmcblk0p1 rw
        fdtdir /boot/dtb/
        initrd /boot/initrd.img

Set the first partition to be bootable (needed to be able to boot):

# sfdisk /dev/loop0 -A 1

Then you need to install a kernel:

# for d in proc dev dev/pts sys ; do mount -o bind /$d rootfs/$d ; done
# LANG=C.UTF-8 chroot rootfs /usr/bin/qemu-arm-static /bin/bash
# source /etc/environment
# apt remove flash-kernel
# apt install linux-image-generic

You then need to write a script in /etc/kernel/postinst.d/zz-generate-dtb-link to generate a symlink from /lib/firmware/<<your-kernel-version>>/device-tree/ to /boot/dtb, so for instance from /lib/firmware/5.4.0-96-generic/device-tree/ to /boot/dtb. I've an incomplete script here:

#!/bin/sh
set -e

version="$1"

ln -sf /lib/firmware/${version}/device-tree/ /boot/dtb

The caveat of this script is that it has not been tested with multiple kernel versions installed, so during apt upgrade, it may or may not make the /boot/dtb link point to the wrong kernel. So that needs to be tested.

With only one kernel installed it should not be a problem.

In addition to that you will also need to make the symlink yourself the first time, before booting the image, like that:

# LANG=C.UTF-8 chroot rootfs /usr/bin/qemu-arm-static /bin/bash
# source /etc/environment
# ln -sf /lib/firmware/<your-kernel-version>/device-tree/ /boot/dtb

You will need to replace the <your-kenrel-version> with your kenrel version, for instance:

# LANG=C.UTF-8 chroot rootfs /usr/bin/qemu-arm-static /bin/bash
# source /etc/environment
# ln -sf /lib/firmware/5.4.0-96-generic/device-tree/ /boot/dtb

You will then need to install a bootloader, here's an example for the lime 1 A20:

# LANG=C.UTF-8 chroot rootfs /usr/bin/qemu-arm-static /bin/bash
# source /etc/environment
# apt update
# apt install u-boot-sunxi
# cat /usr/share/doc/u-boot-sunxi/README.Debian
# dd conv=fsync,notrunc if=/usr/lib/u-boot/A20-OLinuXino-Lime/u of=/dev/loop0 bs=1024 seek=8

You can then unmount and copy to a microSD:

# umount rootfs/dev/pts rootfs/dev rootfs/proc rootfs/sys rootfs/
# ddrescue /dev/loop0 /dev/sdZ # copy to a microSD

Failed installation With Trisquel 10 (nabia)

  • Devices with an Allwiner SOCs: missing devicetree.
  • Devices with OMAP3 SOC: the package instructions / README use dd but u-boot.img is probably expected on a fat partition. And u-boot determine that due to some bug. See Parabola patches for more details. Tested with a beagleboard (probably one of the latest revisions) and MLO complained about not finding u-boot.img
  • On a Pandaboard, it booted the kernel, dtb and initramfs fine, but then the kernel hangs (there are too much backtraces to see where the issue comes from).
  • The TBS2910 is also supported by upstream u-boot but there I coudn't test since u-boot-img 2019.07+dfsg-1ubuntu6 doesn't have an image for it. Maybe support for DISTRO_BOOT was added upstream after that u-boot version.

References