Outils pour utilisateurs

Outils du site


tutoriaux:docker-related:creer-container-86box

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
tutoriaux:docker-related:creer-container-86box [2024/07/16 18:43] – créée fratertutoriaux:docker-related:creer-container-86box [2024/07/18 15:19] (Version actuelle) frater
Ligne 1: Ligne 1:
-====== 86box - PC vintage dans un docker ======+====== EmulDock-86box - PC vintage ======
  
 +Ce n'est un secret pour personne, j'ai toujours aimé les ordinateurs, et je gardes de merveilleux souvenirs de chacun d'eux (SpectraVideo, C64, PC286, Amiga, etc.).  
 +Je considère que je vis une époque formidable, car les machines d'aujourd'hui font fonctionner celles d'hier (et d'avant).
  
 +En surfant sur [[https://www.youtube.com/watch?v=PXUWpbcCL6A|youtube]], j'ai fini par découvrir qu'il était possible d'héberger une machine //vintage// dans un container, la vidéo est très didactique, mais prends quelques libertés avec l'optimisation.
 +
 +Je ne veux pas d'une image //ubuntu//, j'ai une vrai préférence pour //debian//, et dans le build de la vidéo, il y a beaucoup de chose qui me dérange (un serveur web par exemple) ou qui sont liée à l'idée de faire tourner l'émulateur via un browser web (novnc, si tu m'entends :D).
 +
 +Voici donc mon interprétation de cette idée...
 +
 +===== le planning =====
 +
 +J'ai commencé par consulter le //build// de base (disponible [[https://github.com/theonemule/x86box-docker/blob/ea4d4511f44c7bd245f1e85e9403a99339f61d87/dockerfile|ici]])
 +
 +On va retirer tout ce qui relève de la partie web streaming du vnc (novnc, gstreamer1.0-tools, etc.) mais aussi des redondances (tightvncserver, mesa, etc.) alors qu'on va installer des packages spécifiques.  
 +En parlant de packages, la vidéo télécharge des packages directement sans utiliser les packages managers; ce qui me désole également.
 +
 +Toutes mes images sont disponibles sur mon [[https://hub.docker.com/u/saintfrater|dockerhub]].
 +
 +===== le dockerfile =====
 +
 +Je vais donc exposer mon ''dockerfile'' bloc par bloc pour y expliquer la logique.
 +
 +les lignes sont numérotés par "bloc" pour pouvoir expliquer en détail ce qui s'y passe.
 +
 +**Image de base**
 +
 +Cette image est une customisation que j'ai faites, je publierais sans doute un article plus tard, tant cette customisation est avancée.
 +
 +<code yaml [enable_line_numbers="true"]>
 +#
 +# 86Box
 +#
 +FROM    saintfrater/basic-debian:latest
 +ARG     LOCAL_USER=emulator
 +
 +# Create non root group & user
 +RUN     adduser $LOCAL_USER
 +</code>
 +
 +Nous allons également executer l'application avec un utilisateur //non-root//.
 +
 +Cet utilisateur est créer en ligne 8.
 +
 +**Paramétrage du serveur VNC**
 +<code yaml [enable_line_numbers="true"]>
 +#User Settings for VNC
 +ENV PASSWORD=password1
 +</code>
 +
 +Ici l'on peut changer le mot de passe "par défaut" du container, il sera possible de changer 'en permanent' en utilisant un volume (voir plus bas).
 +
 +**Quelques variables d'ajustement**
 +<code yaml [enable_line_numbers="true"]>
 +#Variables for installation
 +ENV DEBIAN_FRONTEND=noninteractive
 +ENV DEBCONF_NONINTERACTIVE_SEEN=true
 +ENV XKB_DEFAULT_RULES=base
 +</code>
 +
 +**Téléchargement de l'AppImage**
 +
 +Une //AppImage// est sans doute le moyen le plus rapide d'installer une application qui n'existe pas en dépôt.
 +
 +Dans l'image d'origine, cette //AppImage// était téléchargée dans le ''/'' du container et ce n'est pas ce que je trouve propre, je propose donc de l'installer dans ''/opt/86box'', et d'y ajuster les configurations (ligne 2-3).
 +
 +<code yaml [enable_line_numbers="true"]>
 +# Download & Setup 86Box
 +RUN     mkdir /opt/86box && \
 +        cd /opt/86box && \
 +        wget -nv https://github.com/86Box/86Box/releases/download/v4.1.1/86Box-Linux-x86_64-b5634.AppImage && \
 +        mv 86Box-Linux-x86_64-b5634.AppImage 86Box.AppImage && \
 +        chmod +x 86Box.AppImage && \
 +        ./86Box.AppImage --appimage-extract > null && \
 +        rm 86Box.AppImage
 +</code>
 +
 +Nous téléchargeons une version particulière de l'//AppImage// (ligne 4); il serait intéressant d'automatiser la "lecture" de cette version, sans doute pour une prochaine release.
 +
 +Cette //AppImage// est rendue exécutable (ligne 6) et exécutée pour forcer l'extraction dans le dossier, on peut ensuite effacer le //AppImage// (ligne 8) car il n'a plus d'utilité a conserver ce fichier.
 +
 +**Téléchargement des BIOS**
 +
 +Un PC ne peut démarrer sans //BIOS//, nous allons donc télécharger les //BIOS// depuis le github de 86box:
 +
 +<code yaml [enable_line_numbers="true"]>
 +RUN     apt-get install -y git
 +# Download BIOSes into 'roms' ~133MB
 +RUN     cd /opt/86box/squashfs-root && \
 +        git clone https://github.com/86Box/roms.git
 +RUN     apt-get purge -y git
 +</code>
 +
 +Pour ce faire, nous avons besoin des outils git sur l'image (ligne 1); nous clonons ensuite les BIOS dans le répertoire ''/roms'' de notre installation (ligne 3-4); nous finissons par purger de l'image les applications git.
 +
 +**Préparation des dossiers de configuration**
 +
 +<code yaml [enable_line_numbers="true"]>
 +# Create symlink for configuration
 +RUN     mkdir /opt/86box/customs && \
 +        mkdir /opt/86box/media && \
 +        chown -R $LOCAL_USER:$LOCAL_USER /opt/86box/customs && \
 +        chown -R $LOCAL_USER:$LOCAL_USER /opt/86box/media && \
 +        mkdir /var/log/86box && \
 +        chown -R $LOCAL_USER:$LOCAL_USER /var/log/86box
 +</code>       
 +
 +Nous créons 2 dossiers //customs// et //media// qui seront ensuite publiés en dehors du container pour sauvegarder les données de façons permanentes.
 +
 +Un dossier "/var/log/86box" est également créer pour recevoir les logs applicatifs.
 +
 +**supervisor et publication de port**
 +<code yaml [enable_line_numbers="true"]>
 +#Copy in supervisor configuration for startup
 +COPY    supervisord.conf /etc/supervisor/supervisord.conf
 +</code>
 +
 +nous copions une version personnalisée de supervisord.conf dans etc.
 +
 +<code yaml [enable_line_numbers="true"]>
 +EXPOSE  5901
 +</code>
 +
 +Nous exposons le port 5901 (VNC) du container.
 +
 +**configuration du mode 'local user'**
 +
 +Comme nous désirons que l'application ne s'execute pas en mode 'root'; nous continuons sous l'utilisateur définit par l'argument "LOCAL_USER".
 +
 +<code yaml [enable_line_numbers="true"]>
 +# setup session as "LOCAL_USER", not root
 +USER    $LOCAL_USER
 +</code>
 +
 +**Configuration VNC Server**
 +
 +Par défaut le password est //password1//, il pourra être changer par la suite.
 +
 +<code yaml [enable_line_numbers="true"]>
 +# Configure VNCServer
 +RUN     mkdir ~/logs/ && \
 +        mkdir ~/.vnc/ && \
 +        echo $PASSWORD | /opt/TurboVNC/bin/vncpasswd -f > ~/.vnc/passwd && \
 +        chmod 0600 ~/.vnc/passwd
 +</code>   
 +
 +**configuration de ratpoison**
 +
 +[[https://linuxpedia.fr/doku.php/ratpoison|RatPoison]] est sans doute l'une des découvertes les plus utile de ce tuto: c'est un gestionnaire de fenêtre très intéressant, il n'a pas besoin de souris pour fonctionner, et en plus, il offre des possibilités de scripting/ configuration et d'automation avancées.
 +     
 +<code yaml [enable_line_numbers="true"]>
 +# Configure application launch
 +RUN     echo "set border 0" > ~/.ratpoisonrc  && \
 +        echo "exec cd /opt/86box/squashfs-root && EMU86BOX_MOUSE=evdev ./AppRun">> ~/.ratpoisonrc
 +</code>
 +
 +Nous réduisons à 0 la bordure des applications (ligne 2) afin de ne pas avoir de cadre a notre application, ensuite nous ordonnons a ratpoison d'executer l'émulateur.
 +
 +**Quelques volumes**
 +
 +<code yaml [enable_line_numbers="true"]>
 +# Create volumes mount
 +# VOLUME /var/log/86box
 +VOLUME /opt/86box/customs
 +VOLUME /opt/86box/media
 +</code>
 +        
 +**Supervisord**
 +
 +L'image d'origine utilise également supervisord pour lancer des taches "de fond", comme le serveur VNC.
 +
 +<code yaml [enable_line_numbers="true"]>
 +#Copy in supervisor configuration for startup
 +ENTRYPOINT [ "supervisord", "-c", "/etc/supervisor/supervisord.conf" ]
 +</code>        
 +
 +====== Configuration ======
 +
 +Si tout se passe bien, vous devirez pouvoir vous connecter en VNC sur votre 86Box, au premier contact l'écran doit ressembler a ceci:
 +
 +{{tutoriaux:docker-related:emuldock-86box-resize-pixels.png?400}}
 +
 +je vous suggère immédiatement de changer le paramètre:
 +
 +{{tutoriaux:docker-related:emuldock-86box-small-screen.png}}
 +
 +pour utiliser tout l'écran, vous pouvez également utiliser de l'openGL (qui est installé)
 +
 +{{tutoriaux:docker-related:emuldock-86box-opengl.png}}
tutoriaux/docker-related/creer-container-86box.1721148188.txt.gz · Dernière modification : 2024/07/16 18:43 de frater