samedi 4 juillet 2020

Retrogaming: Installation Docker dans un linux virtualisé pour compiler Recalbox 7 pour Raspberry pi 4 ;-)



Résultat de recherche d'images pour "ubuntu" 
J'attends depuis trop longtemps Recalbox 7 sur Raspberry Pi 4 ou sur PC x86/x64, donc je me suis dis, et si je me compilé une version à partir de gitlab ?! ;-)... Bien sur dans ce tuto, je ne vous donnerez pas le binaire de l'image Recalbox mais vous pourrez la faire par vous même pour tester celle-ci. Je ne veux pas perturber l'équipe de Recalbox, j'ai trop de respect pour leur travail.

Donc je me suis lancé pour la première fois dans l'utilisation de docker !!!
J'avais en premier lieu essayé d'installer docker sous windows....
Mais mon windows 10 home (famille en Français) était non "upgradable" dans mon cas jusqu'à Juillet 2020.... mais on est début Juillet et toujours rien à l'horizon). 


    
Donc bloqué en version 1909 sous Windows, j'avais du me rabattre sur une distrib raspbian pour faire du Docker. 


     
Mais finalement, la compilation de recalbox demandait une lib c x86 donc incompatible sur un ARM :-(

Donc j'ai fini par installer Ubuntu dans VirtualBox à partir de mon windows 10...

0) Pré-requis

On va donc installer VirtualBox sur notre windows (attention il y aura une coupure réseau pour installer les drivers de la carte réseau) que l'on aura téléchargé au préalable de cette page: https://www.virtualbox.org/










Aprés reboot de votre PC (je le conseil fortement), on peut enfin utiliser VirtualBox et la configurer pour lancer la distrib Linux qui va nous aider à faire le conteur "recalbox-dev".

De plus, pour éviter l'installation et gagner du temps, j'ai téléchargé un image virtualbox déjà prête ici via le projet osboxes (https://www.osboxes.org/virtualbox-images/)
Et il faudra la décompresser bien sur pour avoir un fichier .vdi ;-)


  
Pour info, J'ai donc décidé d'utiliser ubuntu 18.04 dans ma virtualBox, c'est ce que l'on utilise aussi pour l'image docker "recalbox-dev" pour son build, donc j'ai pris le même OS pour "hoster" docker.


1) Créer la VM


Donc on clic sur  et on reste en mode guidé pour configurer simplement les paramètres nécessaires :

- On met un titre et on choisit un chemin pour mettre l'image de la VM et on choisi Linux / Ubuntu (64 bits)

- Puis dans l'écran suivant, je configure à 2 Go voir 4/5 Go pour être tranquille:
(Attention à 2Go, on peut saturer vite pour les cas de la compilation de recalbox et donc beaucoup trop swapper !!!)


- Puis utiliser le fichier .vdi:



- Et donc la machine virtuel est déjà créé et avec l'OS bien sur à l'intérieur:


Je conseil de selectionner la VM créé puis avant de la lancer  d'aller dans  :

Pour mettre la ram Vidéo à 128 Mo et activer l'accélération 3D


Puis sélectionner 2 coeurs si possible (moi j'en ai 4, j'en ai pris la moitié mais on peut en mettre plus si on veut ;-)


2) Lancer la VM en cliquant sur "Démarrer"

- On voit le logo ubuntu, cela se lance...


Puis on arrive sur la page de login avec le user "osboxes.org" avec le password "osboxes.org"

Attention, au début on peut se retrouver avec un clavier "querty" qu'il faudra changer par la suite, donc afficher le mot de passe peut aider ;-)


Et après avoir cliqué sur "Sign In" (et si le mot de passe est bon), on a un écran noir pendant un moment....


Puis on arrive enfin sur le bureau d'Ubuntu:


On va s'occuper du clavier dès maintenant et en passant par en haut à droite puis via 


On arrive dans les settings, et on peut changer l'input... moi j'ai viré l'English et j'ai mis le French (AZERTY):


Pour tester, je suis allé dans firefox, et j'ai tapé des lettres dans la barre d'adresse:


Autre chose, on peut aussi désactiver l'économiseur d'écran (qui dans une VM peut être vraiment stupide ;-) :
(Donc c'est aussi dans les "settings")
Il faut juste mettre Blank screen à "Never":


3) Maintenant on peut installer docker pour linux

Il faut aller dans les applications  et lancer le terminal  

Et ensuite suivre les instructions officiels pour l'installation de docker dans ubuntu sur cette page: https://docs.docker.com/engine/install/ubuntu/

Et pour finir arriver à lancer le hello-world de docker:


4) Ensuite j'ai testé docker en compilant Recalbox par moi même ;-)
J'attends depuis trop longtemps Recalbox 7 sur Raspberry Pi 4 ou sur PC x86/x64, donc je me suis dis, et si je me compilé une version ;-)... donc je me suis lancé pour la première fois dans l'utilisation de docker !!!

4.a) J'ai suivi les commandes indiqués sur le gitlab de recalbox: https://gitlab.com/recalbox/recalbox
(Pensez à bien faire cette commande "sudo usermod -a -G docker $USER" et rebooter une fois avant de continuer)

 je voulais la version  pour Raspberry 4 donc j'ai importé ainsi avec ARCH="rpi4" :
(le nom de l'architecture à cette étape est fait pour bien séparer les builds si vous avez besoin de travailler sur plusieurs archi)

osboxes@osboxes:~$ ARCH="rpi4" && git clone https://gitlab.com/recalbox/recalbox.git recalbox-${ARCH}
Cloning into 'recalbox-rpi4'...
remote: Enumerating objects: 5824, done.
remote: Counting objects: 100% (5824/5824), done.
remote: Compressing objects: 100% (652/652), done.
remote: Total 274071 (delta 5565), reused 5278 (delta 5155), pack-reused 268247
Receiving objects: 100% (274071/274071), 468.86 MiB | 2.41 MiB/s, done.
Resolving deltas: 100% (180774/180774), done.
Checking out files: 100% (3080/3080), done.
osboxes@osboxes:~$

Attention, plus de 450 Mo à télécharger ;-)  

4.b) Puis j'ai lancé le script de recalbox pour compiler dans docker

Avant toute chose il faut aller dans le bon répertoire de l'architecture que vous venait de télécharger dans votre "user" sinon le script ne va pas se lancer dans le bon contexte:

osboxes@osboxes:~$ cd recalbox-rpi4
osboxes@osboxes:~/recalbox-rpi4$ ls
board      CHANGELOG.md        commitlint.config.js  configs  devdocs     DOCUMENTATION.md  external.mk  Makefile  README.md         run_linters  test
buildroot  CODE_OF_CONDUCT.md  Config.in             custom   Dockerfile  external.desc     LICENSE.md   package   RELEASE-NOTES.md  scripts      updatesv2

Puis j'ai lancé la commande suivante:
(j'ai lancé la version sans paramètre parce que les confs sont déjà dispo dans le source code téléchargé et l'archi, c'est pris dans le nom du répertoire, donc il retrouve bien ses petits):

osboxes@osboxes:~/recalbox-rpi4$ scripts/linux/recaldocker.sh

Attention cela peut prendre beaucoup de temps la première fois... beaucoup de download... surtout dans une VM, cela peut être lent ! :-(

Et finalement, je suis tombé parfois sur des erreurs (url non dispo, builroot non créé, etc...)


Dans ce cas n'hésitez pas à relancer, il va reprendre, réutiliser ce qu'il peut et relancer les compilations. Il ne va pas refaire l'image docker si vous l'avez déjà par exemple.


J'ai failli abandonné plusieurs fois à cause des plantages... :-(
Mais finalement, cela se relance bien à chaque fois...
Sans erreurs apparentes (pas de rouge du moins ;-)...


 et pour finir j'ai réussi à avoir cela (en tout, cela à pris plusieurs heures, entre 5 et 10 heures ?!... soyez patient ;-) - dans le répertoire "home" de mon user et donc dans "/recalbox-rpi4/output/images/recalbox":


(En fait, Je n'ai pas réussi à avoir la dernière ligne de compilation, problème de VM qui sature je pense, l'écran à fini sur un écran noir, j'ai du rebooter pour accéder à l'image fabriqué au final ;-)

Conclusion:

En terme de performance même sur un core i7 avec un docker dans une virtualbox, j'ai eu du mal et beaucoup de lenteur, je pense lié surtout au swap et au fait que j'avais alloué au mieux 5 Go à la VM. Il faudrait surement plus donc je pense qu'il faut au moins 4 cœurs et 6Go finalement pour cette compilation, de plus il faut prévoir de l'espace disque finalement parce que la VM à atteint pas loin des 90 Go finalement ..

Mais est ce que j'ai bien compilé ?.... j'ai eu des problèmes en fait , os qui ce fige, problème de download de package interrompu à cause de coupure internet, j'ai du relancer plusieurs fois comme vous avez pu le voir mais au bout du compte j'ai réussi, voici donc ma version de recalbox 7.0 sur ma télé (désolé, j'ai laissé la version "development" avec le Raspberry Pi 4 posé sur mon enceinte Xiaomi pour être sur la photo ;-):


Donc pour finir, grâce à cette compilation on peut se rendre compte que ce n'est pas simple la vie d'un dev recalbox ;-) et du boulot engendré vu la complexité de cette compilation (il y a du monde là dedans ;-) et donc bon courage pour la dernière ligne droite aux devs de recalbox (et j'oubli pas les beta testeurs ;-).

Je vais pouvoir la "poncer" (même si j'ai déjà vu des bugs et c'est normal, c'est une version brute ;-) et cela avant sa sortie pour me préparer aux adaptations de ma borne (j'ai une partie custom à réintégrer ou à refaire en fonction des nouvelles fonctionnalités de la recalbox, regarder mes articles sur mon panel, vous comprendrais ce que j'ai besoin d'adapter ;-)

Enjoy !

Edit 06/08/2020:
Sur une autre compilation pour recalbox PC, j'ai eu aussi des fichiers corrompus où je relançais en vain :-( j'ai donc du supprimer le fichier pour relancer le download.

Voici un exemple de problème  :
>>> scummvm 9ee9fc19ae1a6a1f8263298094c45e245dc5e576 Downloading
--2020-08-06 19:57:24--  https://github.com/scummvm/scummvm/archive/9ee9fc19ae1a6a1f8263298094c45e245dc5e576/scummvm-9ee9fc19ae1a6a1f8263298094c45e245dc5e576.tar.gz
Resolving github.com (github.com)... 140.82.118.4
Connecting to github.com (github.com)|140.82.118.4|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://codeload.github.com/scummvm/scummvm/tar.gz/9ee9fc19ae1a6a1f8263298094c45e245dc5e576 [following]
--2020-08-06 19:57:30--  https://codeload.github.com/scummvm/scummvm/tar.gz/9ee9fc19ae1a6a1f8263298094c45e245dc5e576
Resolving codeload.github.com (codeload.github.com)... 140.82.113.9
Connecting to codeload.github.com (codeload.github.com)|140.82.113.9|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [application/x-gzip]
Saving to: '/home/osboxes/recalbox-x86_64/output/build/.scummvm-9ee9fc19ae1a6a1f8263298094c45e245dc5e576.tar.gz.0IucVi/output'

/home/osboxes/recalbox-x8     [ <=>                               ]  17.88M  30.6KB/s    in 11m 28s 

2020-08-06 20:09:01 (26.6 KB/s) - '/home/osboxes/recalbox-x86_64/output/build/.scummvm-9ee9fc19ae1a6a1f8263298094c45e245dc5e576.tar.gz.0IucVi/output' saved [18747579]

WARNING: no hash file for scummvm-9ee9fc19ae1a6a1f8263298094c45e245dc5e576.tar.gz
>>> scummvm 9ee9fc19ae1a6a1f8263298094c45e245dc5e576 Extracting 
gzip -d -c /share/dl/scummvm/scummvm-9ee9fc19ae1a6a1f8263298094c45e245dc5e576.tar.gz | tar --strip-components=1 -C /home/osboxes/recalbox-x86_64/output/build/scummvm-9ee9fc19ae1a6a1f8263298094c45e245dc5e576   -xf -

gzip: /share/dl/scummvm/scummvm-9ee9fc19ae1a6a1f8263298094c45e245dc5e576.tar.gz: unexpected end of file
tar: Unexpected EOF in archive
tar: Unexpected EOF in archive
tar: Error is not recoverable: exiting now
package/pkg-generic.mk:193: recipe for target '/home/osboxes/recalbox-x86_64/output/build/scummvm-9ee9fc19ae1a6a1f8263298094c45e245dc5e576/.stamp_extracted' failed
make[1]: *** [/home/osboxes/recalbox-x86_64/output/build/scummvm-9ee9fc19ae1a6a1f8263298094c45e245dc5e576/.stamp_extracted] Error 2
make[1]: Leaving directory '/home/osboxes/recalbox-x86_64/buildroot'
Makefile:25: recipe for target 'buildBR' failed
make: *** [buildBR] Error 2
osboxes@osboxes:~/recalbox-x86_64$ 

Donc dans ce cas, on doit supprimer le fichier et son répertoire qui sont dans  /share/dl/scummvm/scummvm-9ee9fc19ae1a6a1f8263298094c45e245dc5e576.tar.gz, et share est finalement le répertoire où l'on build, dans mon cas "recalbox_x86_64". ("share" parce que c'est le répertoire partagé avec l'instance docker)
Pour cela il faut juste aller dans le répertoire pour supprimer le fichier en question puis relancer:

osboxes@osboxes:~/recalbox-x86_64$ cd dl/scummvm
scummvm-osboxes@osboxes:~/recalbox-x86_64/dl/scummvm$ ls
scummvm-9ee9fc19ae1a6a1f8263298094c45e245dc5e576.tar.gz
osboxes@osboxes:~/recalbox-x86_64/dl/scummvm$ rm *.tar.gz
osboxes@osboxes:~/recalbox-x86_64/dl/scummvm$ ls
osboxes@osboxes:~/recalbox-x86_64/dl/scummvm$ cd ..
osboxes@osboxes:~/recalbox-x86_64/dl$ rmdir scummvm
osboxes@osboxes:~/recalbox-x86_64/dl$ cd ..
osboxes@osboxes:~/recalbox-x86_64$

Dans mon cas j'ai aussi le répertoire "output" et son contenu que j'ai supprimé aussi dans le doute ;-) : /home/osboxes/recalbox-x86_64/output/build/scummvm-9ee9fc19ae1a6a1f8263298094c45e245dc5e576

Et donc le téléchargement a pu reprendre ainsi que l'extraction qui a fonctionné pour cette fois lors de la reprise de la commande standard:

osboxes@osboxes:~/recalbox-rpi4$ scripts/linux/recaldocker.sh

Autre solution: dans un autre cas, j'ai du télécharger avec le browser et mettre dans le répertoire de download "dl" pour reprendre le build sans problème.