Table of Contents

Installation archlinux sur BananaPi zero

Cet article présente l'installation et la configuration d'Archlinux sur BananaPi M2 Zero.

Quelques sources:

Prérequis

Préparation côté pc (terminal/console)

Préparation du système hôte

Les paquets suivants doivent être installés dans l'hôte afin de pouvoir compiler le fichier dtb1):

sudo pacman --needed -S uboot-tools wget swig arm-none-eabi-gcc dtc git
sudo apt-get install gcc-arm-none-eabi u-boot-tools swig dtc git wget 

Installer le système de base sur une carte SD

Mettre à zéro le début de la carte SD en remplaçant sdX par le périphérique de bloc du lecteur :

dd if=/dev/zero of=/dev/sdX bs=1M count=8

Utiliser fdisk pour partitionner la carte SD avec une table de partition MBR et formater la partition racine, en remplaçant sdX1 par la partition racine :

mkfs.ext4 -O ^metadata_csum,^64bit /dev/sdX1

Monter le système de fichiers Ext4 :

mkdir mnt
mount /dev/sdX1 mnt

Télécharger ArchLinuxARM avec wget :

wget https://archlinuxarm.org/os/ArchLinuxARM-armv7-latest.tar.gz

Extraire le système de fichiers racine :

bsdtar -xpf ArchLinuxARM-armv7-latest.tar.gz -C mnt/

Créer un fichier boot.cmd avec le script de démarrage suivant:

part uuid ${devtype} ${devnum}:${bootpart} uuid
setenv bootargs console=${console} root=PARTUUID=${uuid} rw rootwait

if load ${devtype} ${devnum}:${bootpart} ${kernel_addr_r} /boot/zImage; then
  if load ${devtype} ${devnum}:${bootpart} ${fdt_addr_r} /boot/dtbs/${fdtfile}; then
    if load ${devtype} ${devnum}:${bootpart} ${ramdisk_addr_r} /boot/initramfs-linux.img; then
      bootz ${kernel_addr_r} ${ramdisk_addr_r}:${filesize} ${fdt_addr_r};
    else
      bootz ${kernel_addr_r} - ${fdt_addr_r};
    fi;
  fi;
fi

if load ${devtype} ${devnum}:${bootpart} 0x48000000 /boot/uImage; then
  if load ${devtype} ${devnum}:${bootpart} 0x43000000 /boot/script.bin; then
    setenv bootm_boot_mode sec;
    bootm 0x48000000;
  fi;
fi

Le compiler et l'écrire sur la carte SD à l'aide du package uboot-tools.

mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "Script de démarrage BananPI" -d boot.cmd mnt/boot/boot.scr
umount mnt

Compiler et copier le chargeur de démarrage U-Boot

L'étape suivante consiste à créer une image u-boot. Les outils arm-none-eabi-gcc, dtc, git, swig et uboot-tools doivent être installés sur le système. Cloner ensuite le code source de u-boot et compiler une image, en veillant à utiliser la configuration defconfig adéquate.

Board Defconfig
M1 Bananapi_defconfig
M1+ bananapi_m1_plus_defconfig
M2 Sinovoip_BPI_M2_defconfig
M2 Berry bananapi_m2_berry_defconfig
M2PLUS-H3 bananapi_m2_plus_h3_defconfig
M2PLUS-H5 bananapi_m2_plus_h5_defconfig
M2 Ultra Bananapi_M2_Ultra_defconfig
M2 Magic Bananapi_m2m_defconfig
M2 Zero bananapi_m2_zero_defconfig
M3 Sinovoip_BPI_M3_defconfig
R1 Lamobo_R1_defconfig

Les cartes M2 Ultra et Magic ont des fichiers d'arborescence de périphériques disponibles. Ils, ainsi que d'autres defconfigs, peuvent être trouvés sur le U-Boot GitLab.

git clone git://git.denx.de/u-boot.git
cd u-boot
make -j4 ARCH=arm CROSS_COMPILE=arm-none-eabi- defconfig
make -j4 ARCH=arm CROSS_COMPILE=arm-none-eabi-

Dans le cas où l'erreur suivante apparaît lors de la compilation :

 Traceback (most recent call last):
 File "./tools/binman/binman", line 31, in <module>
   import control
 File "/u00/thomas/Downloads/bananapi/u-boot/tools/binman/control.py", line 15, in <module>
   import fdt
 File "/u00/thomas/Downloads/bananapi/u-boot/tools/binman/../dtoc/fdt.py", line 13, in <module>
   import libfdt
 File "tools/libfdt.py", line 17, in <module>
   _libfdt = swig_import_helper()
 File "tools/libfdt.py", line 16, in swig_import_helper
   return importlib.import_module('_libfdt')
 File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
   __import__(name)
 ImportError: No module named _libfdt
 make: *** [Makefile:1149: u-boot-sunxi-with-spl.bin] Fehler 1

Il faut s'assurer que l'interpréteur python2 est utilisé. Pour forcer cela, on peut utiliser par exemple :

virtualenv -p /usr/bin/python2.7 my_uboot
source my_uboot/bin/activate

Puis compiler à nouveau comme ci-dessus.

Si tout s'est bien passé, on devrait avoir une image U-Boot : u-boot-sunxi-with-spl.bin. Maintenant, ajouter l'image sur la carte SD, où /dev/sdX est la carte SD.

dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=1024 seek=8

Pilote X.org

Le pilote X.org pour Banana Pi peut être installé avec le package xf86-video-fbdev.

Dépannage

Ethernet ne fonctionne pas

Dans certains cas, la connexion Ethernet Gbit est instable ou ne fonctionne pas correctement. Il peut être utile de limiter la vitesse de la liaison à 100 Mbps en utilisant ethtool :

ethtool -s eth0 speed 100 duplex half autoneg off

L'écran s'éteint après l'inactivité et ne se rallume plus

Si vous rencontrez également un problème avec l'affichage qui s'éteint après un certain temps d'inactivité et ne se rallume pas, vous pouvez désactiver DPMS. Ajoutez donc ces arguments X11 à la bonne configuration de votre gestionnaire d'affichage.

-s 0 -dpms

Par exemple, pour utiliser SLiM, modifier /etc/slim.conf:

xserver_arguments -nolisten tcp vt07 -s 0 -dpms

Si, pour une raison quelconque, l'écran continue de s'éteindre, par ex. au redémarrage de votre appareil de réception, vous pouvez le rallumer, en modifiant temporairement la résolution :

# echo "D:1280x720p-60" > /sys/class/graphics/fb0/mode
# echo "D:1920x1080p-60" > /sys/class/graphics/fb0/mode

Scripte d'installation

Le scripte suivant permet de préparer une carte SD en exécutant l'ensemble des instructions ci-dessus


# détection de la carte SD
# souvent /dev/sd...
# ou
# /dev/mmcblk... !!!que la substitution du 1/2 ajouté à p1/p2!!!
sudo fdisk -l
export target_disc=/dev/...

# effacer la carte SD
sudo dd if=/dev/zero of=${target_disc} bs=1M count=8

# générer des partitions
sudo parted -s ${target_disc} mklabel msdos
sudo parted -a optimal -- ${target_disc} mkpart primary 2048s 150M
sudo parted -a optimal -- ${target_disc} mkpart primary 150M 100%

# formatage
sudo mkfs.ext4 -O ^metadata_csum,^64bit ${target_disc}1
sudo mkfs.ext4 -O ^metadata_csum,^64bit ${target_disc}2
export target_uuid1=$(sudo blkid ${target_disc}1 | awk '{print $2}')
export target_uuid2=$(sudo blkid ${target_disc}2 | awk '{print $2}')
export target_partuuid=$(sudo blkid ${target_disc}2 | awk '{print $4}')

# écrire les images
mkdir -p BananaM2Zero
cd BananaM2Zero
mkdir -p root
mkdir -p boot
sudo mount ${target_disc}1 boot
sudo mount ${target_disc}2 root
wget http://archlinuxarm.org/os/ArchLinuxARM-armv7-latest.tar.gz
sudo bsdtar -xpf ArchLinuxARM-armv7-latest.tar.gz -C root
sudo mv root/boot/* boot/.
echo "${target_uuid2}       /               ext4            rw,relatime     0 1" | sudo tee -a root/etc/fstab
echo "${target_uuid1}       /boot           ext4            rw,relatime     0 2" | sudo tee -a root/etc/fstab

# installation du système de démarrage
cat <<EOF > boot.cmd.sd-card
part uuid \${devtype} \${devnum}:\${bootpart} uuid
setenv bootargs console=\${console} root=${target_partuuid} rw rootwait

if load \${devtype} \${devnum}:\${bootpart} \${kernel_addr_r} zImage; then
  if load \${devtype} \${devnum}:\${bootpart} \${fdt_addr_r} dtbs/\${fdtfile}; then
    if load \${devtype} \${devnum}:\${bootpart} \${ramdisk_addr_r} initramfs-linux.img; then
      bootz \${kernel_addr_r} \${ramdisk_addr_r}:\${filesize} \${fdt_addr_r};
    else
      bootz \${kernel_addr_r} - \${fdt_addr_r};
    fi;
  fi;
fi

if load \${devtype} \${devnum}:\${bootpart} 0x48000000 uImage; then
  if load \${devtype} \${devnum}:\${bootpart} 0x43000000 script.bin; then
    setenv bootm_boot_mode sec;
    bootm 0x48000000;
  fi;
fi
EOF

sudo mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "BananaM2Zero boot script" -d boot.cmd.sd-card boot/boot.scr
sudo umount boot
sudo umount root

# installer u-boot

git clone git://git.denx.de/u-boot.git
cd u-boot
make -j4 ARCH=arm CROSS_COMPILE=arm-none-eabi- bananapi_m2_zero_defconfig
make -j4 ARCH=arm CROSS_COMPILE=arm-none-eabi-
sudo dd if=u-boot-sunxi-with-spl.bin of=${target_disc} bs=1024 seek=8 && sync

Finalisation de l'installation

Configuration de l'accès SSH

Se connecter à la console en tant qu'utilisateur root et mot de passe root.

Type Nom d'utilisateur Mot de passe
Root root root
User alarm alarm

exécuter maintenant ces commandes :

loadkeys fr
passwd root
pacman-key --init
pacman-key --populate archlinuxarm
pacman -ySu sudo uboot-tools dialog wpa_supplicant
useradd -m -g users -G wheel -s /bin/bash $username$
passwd $username$
userdel alarm
systemctl enable sshd.service
# notice ip-adresse for eth0
ip a

Configurer l'accès wifi

Des appareils comme le M2 Zero fournissent une puce pour le WiFi et le Bluetooth, qui nécessite le firmware brcm 43430. dmesg affichera cela:

brcmfmac mmc1:0001:1: Direct firmware load for brcm/brcmfmac43430-sdio.sinovoip,bpi-m2-zero.txt failed with error -2

Le référentiel Arch Linux ARM fournit le package firmware-raspberrypi.

sudo wifi-menu

Redémarrer

reboot

La connexion SSH pour root est désactivée par défaut. Se connecter avec le compte utilisateur par défaut et utiliser su.

ssh $user_name$@$ipadresse$
sudo su

Configuration des locales

echo "fr_FR.UTF-8 UTF-8" >> /etc/locale.gen
echo "fr_FR ISO-8859-1" >> /etc/locale.gen
locale-gen
echo "LANG=fr_FR.UTF-8 UTF-8"" >> /etc/locale.conf
echo "LANGUAGE=fr_FR" >> /etc/locale.conf
echo "LC_ALL=C" >> /etc/locale.conf
echo "%wheel ALL=(ALL) ALL" >> /etc/sudoers
exit
reboot

Installation de python

sudo pacman --needed -S python python-pip

Installation des bibliothèques GPIO

Le package https://github.com/LeMaker/RPi.GPIO_BP fournit une classe pour contrôler le GPIO sur un BananaPi.

sudo pacman --needed -S gpio-utils python-periphery wiringx-git git base-devel
git clone https://github.com/LeMaker/RPi.GPIO_BP -b bananapi
python setup.py install
sudo python setup.py install

Pour tester on va modifier l'état du GPIO(17) de LOW à HIGH et de HIGH à LOW, chaque seconde

cat <<EOF > test.py
import RPi.GPIO as GPIO
from time import sleep
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)
while True:
    GPIO.output(17, GPIO.HIGH)
    sleep(1)
    GPIO.output(17, GPIO.LOW)
    sleep(1)
EOF

sudo python test.py
1)
Un fichier dtb contient un Device Tree Blob, permettant de transmettre des informations matérielles sur la carte au noyau Linux. Il peut être chargé en mémoire et transmis au noyau par u-Boot