# Installation archlinux sur BananaPi zero {{INLINETOC}} Cet article présente l'installation et la configuration d'Archlinux sur BananaPi M2 Zero. Quelques sources: * http://www.banana-pi.org/downloadall.html * https://wiki.archlinux.org/index.php/Banana_Pi#Compile_and_copy_U-Boot_bootloader ## Prérequis * pc hôte avec linux * lecteur/graveur de carte sd * carte micro-sd avec 4 Go ou plus * accès Internet * moniteur avec entrée HDMI * connexion réseau filaire avec dhcp, accès entre pc et bananapi et accès internet * clavier usb pour saisie directe ## 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 **dtb**((Un fichier **dtb** contient un **D**evice **T**ree **B**lob, 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)): * **u-boot-tools**: outils compagnons pour le chargeur de démarrage **Das U-Boot** * **swig**: outil logiciel d'interfaçage pour lier des programmes en C/C++ avec des programmes de plus haut-niveau comme Python * **dtc**: Device Tree Compiler, prend en entrée une arborescence de périphériques dans un format donné et génère un device-tree dans un autre format pour démarrer les noyaux sur les systèmes embarqués. Typiquement, le format d'entrée est "dts", un format source lisible par l'homme, et crée un format **dtb**, ou binaire en sortie. ``` 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 import control File "/u00/thomas/Downloads/bananapi/u-boot/tools/binman/control.py", line 15, in import fdt File "/u00/thomas/Downloads/bananapi/u-boot/tools/binman/../dtoc/fdt.py", line 13, in import libfdt File "tools/libfdt.py", line 17, in _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 < 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 * mettre la carte sd dans bananapi * connecter hdmi, réseau, clavier * connecter l'alimentation USB ### 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 < 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 ```