Comment puis-je créer une distribution personnalisée pour exécuter un simple navigateur Web?


18

Nous assemblons des machines légères dans le but exprès d'afficher une seule page Web sur un grand écran. J'ai besoin que la machine démarre essentiellement aussi légère et aussi rapidement que possible et qu'elle exécute essentiellement un navigateur (WebKit?) En plein écran, chargeant une page qui sera contrôlée dynamiquement par JavaScript. J'utiliserai un processeur Intel D525 dual-core avec GPU intégré, donc je ne devrais pas avoir besoin de configurer de pilotes graphiques propriétaires. Une fois que j'ai installé une de ces machines correctement, je devrais simplement être en mesure de placer ddle disque dur sur mon ordinateur et de le vider sur chaque nouvelle machine.

J'ai les questions suivantes:

  1. Comment puis-je créer une "distribution" qui ne comprend que ce dont j'ai besoin? Je suppose que j'aurai besoin du noyau (;]), de X et d'un navigateur Web quelconque, mais pas trop. Puis-je prendre quelque chose comme Ubuntu Server et simplement installer X Server et trouver un moyen pour que la machine se connecte automatiquement, démarre X et démarre le navigateur Web, sans poser de questions? Y a-t-il un livre que je peux lire ou un article ou quelque chose?

  2. Que puis-je utiliser pour un joli navigateur Web dépouillé qui exécute essentiellement un "chrome sans chrome"? Ces machines n'accepteront pas du tout les commentaires des utilisateurs. Si je dois les gérer, j'utiliserai SSH.

Réponses:


12

De nombreuses distributions ont une certaine facilité pour une installation minimale; essentiellement où vous sélectionnez manuellement uniquement les packages que vous souhaitez explicitement installer. Debian a cette capacité et serait un meilleur choix, dans votre situation, que l'autre concurrent minimal évident, Arch Linux.

Le statut de publication continue d'Arch peut fournir un niveau de complexité continue que vous souhaitez éviter. Debian fournirait la base simple et minimale que vous recherchez ainsi que la stabilité de l'offre. Il y a un article de blog sur l'utilisation de Debian comme kiosque qui peut offrir quelques conseils utiles.

Pour un navigateur, comme le suggère beav_35 , Uzbl est un bon choix. Ma recommandation serait Vimprobable , un navigateur WebKit scriptable, piloté par clavier et pouvant être contrôlé efficacement via SSH.

En tant que gestionnaire de fenêtres, je recommanderais dwm : à moins de 2000 SLOC, il est extrêmement léger et peut être facilement configuré pour une configuration de type kiosque.


dwm a fière allure à cet effet, et je suis de toute façon beaucoup plus familier avec les systèmes basés sur Debian, donc je vais probablement utiliser Debian. À quel point pensez-vous que je peux obtenir le système d'exploitation? Et comment puis-je construire une distribution Debian?
Naftuli Kay

Au cours de l'installation, lorsque vous atteignez l'étape de sélection des packages, au lieu de Laptop, Standard, etc., choisissez "Manual" et sélectionnez uniquement les packages (comme X) dont vous avez besoin pour un strict minimum: commencez ici debian.org/CD / netinst / # businesscard-stable
jasonwryan

5

Tout d'abord, vous ne voudrez peut-être pas réinventer la roue ... Il existe plusieurs distributions axées sur les kiosques. L'un d'eux pourrait vous faire économiser beaucoup de travail.

Deuxièmement, si vous connaissez Kickstart sur Fedora et RHEL (ou CentOS ou Scientific Linux), vous pouvez utiliser les outils Fedora pour faire votre propre rotation de l'une de ces distributions. La documentation est un peu dispersée, mais commencez ici .


Équivalent Debian / Ubuntu: FAI (Installation entièrement automatique)
Gilles 'SO- arrête d'être méchant'

4

Commencez avec une distribution minimale comme Arch Linux , puis installez les packages dont vous avez besoin. Pour un simple navigateur Web, essayez Uzbl .


uzbl est génial. +1
Naftuli Kay

3

C'est une question assez complexe, et comme votre projet n'est pas tout à fait clair, certaines de ces suggestions peuvent être hors de propos, mais considérez-les comme des choses à évaluer.

  • Vous n'avez peut-être pas besoin d'un navigateur Web sur un ordinateur faisant partie de la matrice d'affichage. Si vous essayez d'afficher une seule page sur plusieurs écrans, il est probable que vous souhaitiez utiliser une sorte de technologie d'affichage de masse. Il existe plusieurs variantes de Xorg qui se spécialisent dans la génération d'un grand écran à partir de périphériques vidéo sur plusieurs machines.

  • Même si vous utilisez des serveurs X distincts sur chaque machine, vous pouvez utiliser le transfert X pour envoyer des données d'affichage à partir d'un ou plusieurs autres ordinateurs, afin que les navigateurs n'aient toujours pas à s'exécuter localement.

  • Vous souhaiterez soit ne pas utiliser de gestionnaire de fenêtres du tout et utiliser les spécifications de géométrie pour lancer votre application en plein écran, soit utiliser un gestionnaire de fenêtres de tuiles ou de structure configurable (tel que awesome) pour gérer les fenêtres sur chaque affichage X. Ceux-ci facilitent le tri et le contrôle des fenêtres en plein écran et sont hautement scriptables.

  • En ce qui concerne un navigateur, je pense que uzblc'est probablement le choix clair.

  • Cela pourrait être une bonne application pour le démarrage réseau. Vous pouvez configurer un serveur avec un noyau de netbook disponible via TFTP et un système de fichiers disponible via nfs. Tout ce que vos clients doivent faire est d'utiliser une carte réseau compatible Netboot pour contacter ce serveur, télécharger leur noyau et c'est parti. Aucun disque dur impliqué! Et entretien facile. Toutes les machines peuvent potentiellement démarrer la même image.

  • Votre "distribution" devrait probablement comprendre deux choses. 1) un ensemble de packages et 2) un ensemble de fichiers de configuration. L'ensemble de packages est une liste de packages qui doivent être installés. Cela peut généralement être assemblé dans un fichier texte et vous pouvez ensuite utiliser la plupart des gestionnaires de packages de distribution pour installer cette liste de packages sur une cible (soit un disque dur ou un répertoire qui sera votre point de montage nfs). Les fichiers de configuration devraient probablement être conservés dans gitou dans un autre système de contrôle de source et contenir quelques scripts et tous les mods de configuration à apporter au système de base installé avec l'ensemble de packages. Construire un nouveau système devient alors:

    • Monter le lecteur ou le répertoire cible
    • package_manager --install-distro --package-set=/path/packagelist.txt --target=/path
    • cd /target/path
    • git clone /path/to/repo (ou sinon récupérez votre code de configuration à la racine du système)
    • Installer le chargeur de démarrage si le lecteur ou ajouter la configuration PXE si le démarrage réseau
    • démarrage.

La distribution que vous utilisez comme base devrait dépendre de ce avec quoi vous êtes le plus à l'aise. J'utiliserais PLD-Linux pour moi-même, mais je recommanderais probablement ArchLinux comme système similaire mais mieux documenté pour un débutant. Il n'y a aucune raison que Debian , Fedora ou Gentoo ne fonctionnent pas pour cela.


sur le démarrage net: cela semble génial et rendrait les choses beaucoup plus faciles à entretenir. Cependant, chaque machine doit charger une URL différente, car elle récupérera des informations uniques à la machine. Est- ce faisable? Tout le reste resterait ostensiblement le même, bien que je puisse configurer chaque machine pour utiliser un utilisateur / mot de passe différent pour l'authentification HTTP-Basic comme un petit moyen de sécurité.
Naftuli Kay

sur "Vous n'avez peut-être pas besoin d'un navigateur Web sur chaque ordinateur faisant partie du réseau d'affichage": je pense que oui, en fait. Chacune de ces machines sera dans un emplacement différent, pilotant un écran via VGA ou HDMI, affichant une page Web unique pour cette machine. (bien que nous puissions servir une URL unique qui varie le contenu en fonction de l'utilisateur / mot de passe).
Naftuli Kay

sur les gestionnaires de fenêtres: j'utiliserais probablement un modèle vraiment léger comme dwmou awesome. Comment puis-je dire à un gestionnaire de fenêtres de démarrer une application sans la barre de titre en mode plein écran?
Naftuli Kay

sur ce que devrait être la distribution: donc tout ce dont j'ai vraiment besoin est de créer un dépôt git, de conserver une liste de paquets et des fichiers de configuration, puis de créer une image ISO d'une manière ou d'une autre. Comment puis-je obtenir la plus petite distribution Debian et ensuite travailler à partir de là? Comment puis-je prendre ces fichiers de configuration et créer une image ISO gravable? J'utiliserais apt-getou aptitudesur Debian.
Naftuli Kay

sur le transfert X: cela ne devrait pas vraiment être nécessaire, car je piloterai un écran par machine. Je vais probablement devoir trouver un moyen pour que la machine émette une connexion SSH inversée afin que mon ordinateur puisse s'y connecter, mais il pourrait y avoir un moyen d'automatiser cela. Existe-t-il un moyen pour qu'un ordinateur A ouvre une connexion TCP à l'ordinateur B et que l'ordinateur B se connecte via cette connexion à l'ordinateur A via SSH? Sinon, je devrais obtenir des noms DNS dynamiques pour chaque routeur: pas amusant / facile.
Naftuli Kay

2

Buildroot 2016.05 + Midori

Buildroot est un excellent outil pour créer des distributions minimales:

  • vous lui donnez un .configdossier
  • il télécharge et compile tous les logiciels et dépendances nécessaires, et produit une image

Midori est un navigateur minimaliste basé sur WebKit et Buildroot a un package Midori intégré.

.configfichier utilisé: https://github.com/cirosantilli/buildroot-configs/blob/32d1174e0bf8d00b92323eebe8901af3f8c389d3/2016.05/qemu_x86_64_x11_midori_defconfig

Comment générer ce fichier de configuration:

  1. Suivez: Comment installer X11 sur mon propre système Linux Buildroot? | Unix & Linux Stack Exchange pour créer une image avec X11.
  2. make menuconfig
    1. Chaîne d'outils
      1. Bibliothèque C
        1. glibc (pour midori)
    2. Forfaits cibles
      1. Bibliothèques graphiques et applications
        1. mesa3d
          1. sélectionner tous les pilotes Gallium et DRI car je ne comprends pas lequel est nécessaire (pour OpenGL EGL)
          2. OpenGL EGL (pour libgtk3)
      2. Bibliothèques
        1. Graphiques 1. libgtk3 (pour midori)

Nettoyez la version car nous avons modifié la chaîne d'outils et compilez à nouveau:

rm -rf output
make BR2_JLEVEL=$(nproc)

Attendez des heures. Puis l'habituel:

qemu-system-x86_64 \
    -enable-kvm \
    -M pc \
    -m 512 \
    -kernel output/images/bzImage \
    -drive file=output/images/rootfs.ext2,if=virtio,format=raw \
    -append root=/dev/vda \
    -net nic,model=virtio \
    -net user

Et de l'intérieur de QEMU:

root
startx

et à partir de l'interface graphique X11, cliquez sur une xtermfenêtre et exécutez:

midori

Résultat:

entrez la description de l'image ici

Taille d'image: 220M! Comparez cela aux 28M d'un système X11 nu Comment installer X11 sur mon propre système Linux Buildroot? - Échange de pile Unix et Linux . Probablement en raison des dépendances de WebKit + GTK3.

Testé sur l'hôte Ubuntu 16.04, QEMU 2.5.0.

NetSurf

Écrit en SDL, qui prend en charge le fbdev: http://www.netsurf-browser.org/about/screenshots/#framebuffer

fbdev est une interface de niveau inférieur offerte par un module du noyau Linux qui ne passe pas par X11 (je pense que X11 peut éventuellement l'utiliser comme backend). Vous écrivez simplement dans la mémoire et cela apparaît à l'écran.

Pour utiliser fbdev sur Ubuntu, vous devez être sur un TTY (par exemple Ctrl + Alt + F1).

Vous pouvez donc probablement vous en sortir avec une image beaucoup plus petite que celle de Midori.

Buildroot 2016.05 a un package netsurf-buildsystemqui devrait le fournir, mais je n'ai pas testé. Si quelqu'un parvient à le faire fonctionner, veuillez le modifier dans un lien vers un .config, une capture d'écran et une taille d'image.


1

J'ai écrit un petit script bash une fois qui prend un ISO Arch Linux et génère un nouveau ISO avec une image racine modifiée qui fait une installation entièrement automatisée. Cela inclut le partitionnement ainsi que l'installation et la configuration du système avec Xorg, FVWM et Chromium. Le système installé se connectera automatiquement et démarrera Chromium. Mettez simplement la nouvelle ISO sur une clé USB et détendez-vous. ;-)

Avertissement: le script est fourni tel quel, aucune garantie n'est donnée. Je ne l'ai pas utilisé depuis un moment, il pourrait donc avoir besoin d'un ajustement ici ou là. Modifiez au besoin.

#!/bin/bash
# Helpful pages:
#
#   * [ArchWiki topic][1] that explains the options of an AIF configuration
#     file.
#
#   * [Status of automated installation][2], a topic in the Arch Linux Forums
#     that contains the original basic install script by *mhertz*.
#
# [1]: https://wiki.archlinux.org/index.php/AIF_Configuration_File
# [2]: https://bbs.archlinux.org/viewtopic.php?id=111925

TMP_DIR=/tmp/arch-install

# Read command line parameters for input and output ISO files.
if [ -z "$1" ]; then
    echo 'No input file specified, aborting.'
    exit 1
elif [ ! -f "$1" ]; then
    echo 'Input file "'$INPUT_ISO'" not found, aborting.'
    exit 1
elif [ -z "$2" ]; then
    echo 'No output file specified, aborting.'
    exit 1
elif [ -f "$2" ]; then
    echo 'Output file "'$OUTPUT_ISO'" already exists, aborting.'
    exit 1
fi

# Determine full paths to input and output ISO files.
INPUT_ISO=$(readlink -f "$1")
OUTPUT_ISO=$(readlink -f "$2")

# Set some variables for convenience.
SOURCE_DIR=$TMP_DIR/source
DEST_DIR=$TMP_DIR/dest
ROOT_DIR=$TMP_DIR/squashfs-root
BOOT_CFG=$DEST_DIR/boot/isolinux/isolinux.cfg

# Extract ISO image and root image.
mkdir -p $SOURCE_DIR
mount -o loop "$INPUT_ISO" $SOURCE_DIR
cp -a $SOURCE_DIR $DEST_DIR
umount $SOURCE_DIR
rmdir $SOURCE_DIR
unsquashfs -d $ROOT_DIR $DEST_DIR/root-image.sqfs
rm $DEST_DIR/root-image.sqfs

# Modify the root image as needed.
cat >> $ROOT_DIR/etc/aif.conf <<EOF
SOURCE=cd
FILE_URL=file:///src/core/pkg
SYNC_URL=http://ftp.tu-chemnitz.de/pub/linux/archlinux/\$repo/os/\$arch
HARDWARECLOCK=UpTC
TIMEZONE=Europe/Vienna
RUNTIME_REPOSITORIES=
RUNTIME_PACKAGES=
TARGET_GROUPS=base
TARGET_PACKAGES_EXCLUDE=
TARGET_PACKAGES='openssh xorg xcursor-vanilla-dmz-aa'

worker_runtime_network () {
    dhcpcd eth0
}

worker_configure_system () {
    prefill_configs
    sed -i '/^HOSTNAME/ s/"myhost"/"arch"/' \$var_TARGET_DIR/etc/rc.conf
    sed -i '/^password/ s/pam_permit\.so/pam_unix.so md5 shadow/' \$var_TARGET_DIR/etc/pam.d/chpasswd
    sed -i '\|Server = http://ftp\.tu-chemnitz\.de/| s/^#//' \$var_TARGET_DIR/etc/pacman.d/mirrorlist
    sed -i '/id:3:initdefault:/ s/^/#/' \$var_TARGET_DIR/etc/inittab
    sed -i '/id:5:initdefault:/ s/^#//' \$var_TARGET_DIR/etc/inittab
    sed -i '\|x:5:respawn:/usr/bin/xdm| s/^/#/' \$var_TARGET_DIR/etc/inittab
    echo "x:5:respawn:/bin/su -l -c '/usr/bin/startx </dev/null >/dev/null 2>&1' myuser" >> \$var_TARGET_DIR/etc/inittab
    sed -i 's/^timeout .*$/timeout 0/' \$var_TARGET_DIR/boot/grub/menu.lst
    cp /etc/rc.local.firstboot \$var_TARGET_DIR/etc/rc.local
}

# Mandatory variables.
GRUB_DEVICE=/dev/sda
PARTITIONS='/dev/sda 20:ext2:+ 512:swap 2500:xfs *:xfs'
BLOCKDATA='/dev/sda1 raw no_label ext2;yes;/boot;target;no_opts;no_label;no_params
/dev/sda2 raw no_label swap;yes;no_mountpoint;target;no_opts;no_label;no_params
/dev/sda3 raw no_label xfs;yes;/;target;no_opts;no_label;no_params
/dev/sda4 raw no_label xfs;yes;/home;target;no_opts;no_label;no_params'
EOF

cat >> $ROOT_DIR/etc/rc.local <<EOF
aif -p automatic -c /etc/aif.conf
reboot
EOF

cat >> $ROOT_DIR/etc/rc.local.firstboot <<EOF
echo root:rootpassword | chpasswd
useradd -m myuser
echo myuser:myuser | chpasswd
cat >> /home/myuser/.xinitrc <<EOT
#!/bin/sh
exec fvwm2
EOT
cat >> /home/myuser/.Xdefaults <<EOT
Xcursor.theme: Vanilla-DMZ-AA
EOT
mkdir -p /home/myuser/.fvwm
cat >> /home/myuser/.fvwm/config <<EOT
DeskTopSize 1x1
DesktopName 0 Main
DestroyFunc StartFunction
AddToFunc StartFunction
 + I Test (Init) Exec exec xsetroot -solid '#303030'
 + I Test (Init) Exec exec chromium 'http://www.stackoverflow.com'
DestroyMenu RootMenu
AddToMenu RootMenu "Menu" Title
 + "Terminal" Exec exec xterm
 + "Browser" Exec exec chromium 'https://www.stackoverflow.com'
 + "" Nop
 + "Log off" Quit
 + "Reboot" Exec exec sudo /sbin/reboot
 + "Shutdown" Exec exec sudo /sbin/halt
OpaqueMoveSize unlimited
Style * ClickToFocus, ResizeOpaque
Style chromium !Title, !Border, !Handles
CursorStyle root top_left_arrow
CursorStyle stroke hand2
IgnoreModifiers L25
Key Help R A -
Key F1 R A -
Key Tab A M -
Key Escape A MC -
Mouse 1 R A -
Mouse 1 T A Move
Mouse 1 FS A Resize
Mouse 1 I A Iconify Off
Mouse 2 FST A -
Mouse 3 R A Menu RootMenu Nop
EOT
mkdir -p /home/myuser/.config/chromium/Default
touch /home/myuser/.config/chromium/First\ Run
cat >> /home/myuser/.config/chromium/Default/Preferences <<EOT
{
   "alternate_error_pages": {
      "enabled": false
   },
   "autofill": {
      "enabled": false
   },
   "browser": {
      "custom_chrome_frame": true,
      "enable_spellchecking": false
   },
   "default_search_provider": {
       "enabled": true,
       "encodings": "UTF-8",
       "icon_url": "about:blank",
       "id": "2",
       "instant_url": "",
       "keyword": "google.com",
       "name": "Google",
       "prepopulate_id": "1",
       "search_url": "{google:baseURL}search?ie={inputEncoding}&q={searchTerms}",
       "suggest_url": ""
   },
   "devtools": {
      "disabled": true
   },
   "dns_prefetching": {
      "enabled": false
   },
   "download": {
      "directory_upgrade": true
   },
   "extensions": {
      "chrome_url_overrides": {
         "bookmarks": [ "chrome-extension://eemcgdkfndhakfknompkggombfjjjeno/main.html" ]
      }
   },
   "geolocation": {
      "default_content_setting": 2
   },
   "google": {
      "services": {
         "username": ""
      }
   },
   "homepage": "https://www.stackoverflow.com",
   "homepage_is_newtabpage": false,
   "intl": {
      "accept_languages": "en",
      "charset_default": "ISO-8859-1"
   },
   "ntp": {
      "pref_version": 3
   },
   "profile": {
      "clear_site_data_on_exit": true,
      "content_settings": {
         "pref_version": 1
      },
      "default_content_settings": {
         "plugins": 1
      },
      "exited_cleanly": true,
      "notifications_default_content_setting": 2,
      "password_manager_enabled": false
   },
   "safebrowsing": {
      "enabled": false
   },
   "search": {
      "suggest_enabled": false
   },
   "tabs": {
      "use_vertical_tabs": false
   },
   "translate": {
      "enabled": false
   }
}
EOT
chown -R myuser:myuser /home/myuser
pacman -Sy
pacman -S --noconfirm pacman
pacman -S --noconfirm fvwm-devel chromium sudo
echo 'myuser arch=NOPASSWD: /sbin/halt,/sbin/reboot' > /etc/sudoers.d/start_stop
chmod 0440 /etc/sudoers.d/start_stop
rm /etc/rc.local
EOF

# Create the new root image.
mksquashfs $TMP_DIR/squashfs-root $TMP_DIR/dest/root-image.sqfs
rm -rf $TMP_DIR/squashfs-root

# Configure the boot loader.
sed -i 's/TIMEOUT 3000/TIMEOUT 100/' $BOOT_CFG
sed -i '/APPEND hd0 0/d' $BOOT_CFG
sed -i 's/archisolabel=[^ ]*/archisolabel=ARCH/' $BOOT_CFG

# Create the new ISO image.
genisoimage -l -R -b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat \
    -no-emul-boot -boot-load-size 4 -boot-info-table -V ARCH \
    -o "$OUTPUT_ISO" $DEST_DIR
rm -rf $TMP_DIR
isohybrid "$OUTPUT_ISO"

0

Pour un système comme celui-ci, je recommanderais Puppy .

Bien que vous puissiez créer votre distribution à l'aide de n'importe quelle version de Linux, Puppy facilite la création d' images de démarrage personnalisées, est conçu pour être compact et offre une excellente prise en charge du système de fichiers de superposition.

Je devrais juste pouvoir dd le disque dur

Non - je recommanderais de construire une image amorçable que vous pouvez raisonnablement maintenir - l'approche que vous proposez reviendra et vous mordra.


Le truc, c'est que je vais exécuter le système d'exploitation sur une clé USB. Je n'aurai même pas potentiellement de lecteur de disque avec lequel installer le système d'exploitation.
Naftuli Kay

0
  • Plusieurs personnes ont mentionné uzbl et je suis d'accord pour dire que c'est un bon choix - mais vous trouverez peut-être encore mieux luakit .

  • Comme Caleb l'a déjà mentionné, vous n'avez pas vraiment besoin de gestionnaire de fenêtres. Voici un exemple de script que j'ai conçu pour exécuter un serveur Xorg sans WM avec un navigateur luakit maximisé:

    #!/bin/sh
    XDCMD="xdotool search --class luakit windowsize %3 100% 100%"
    while [ 1 ]
    do
        ( sleep 0.5; $XDCMD || sleep 0.2 && $XDCMD || sleep 5 && $XDCMD ) &
        /usr/bin/luakit $@
    done
    

    Il utilise xdotool pour maximiser la fenêtre juste après le démarrage de luakit. Mais il y a peut-être une meilleure solution à cela ...

  • Pour la base d'un tel système, je recommanderais certainement Gentoo. Ce n'est pas seulement parce que je le connais le mieux;) mais aussi parce qu'il utilise une approche plutôt unique de gestion globale des options de construction de tous les logiciels installés. Je veux dire les drapeaux USE . En les utilisant, vous déterminez l'ensemble des fonctionnalités / bibliothèques / normes utilisées par tous les programmes qui les prennent en charge - ainsi, par exemple, si vous voulez que vos programmes utilisent ALSA et n'aient pas besoin de backends audio supplémentaires comme esd, jack ou pulseaudio, vous placez alsa -jack -esd -pulseaudioparmi vos drapeaux USE. Après cela, chaque logiciel que vous créez qui peututiliser des backends audio supplémentaires en dehors d'ALSA sera construit sans leur support. Comme cela se produit au niveau de la configuration / construction, vous vous retrouvez avec un logiciel beaucoup plus fin. Il s'agit donc d'une philosophie de construction (tout en respectant toutes les dépendances) au lieu de dépouiller (ce qui peut finir par être bogué et très difficile à maintenir).


0

Je mentionnerai cela parce que je suis surpris que personne d'autre ne l'ait fait.

Linux from Scratch est un livre (pdf) qui vous guide à travers la création de votre propre distribution Linux. Cela peut être exagéré pour ce que vous essayez d'accomplir (en fait, c'est parce que vous avez déjà les outils dont vous avez besoin), mais cela peut s'avérer un outil inestimable pour comprendre le fonctionnement d'un système. Ce n'est vraiment pas si difficile et aucune programmation n'est impliquée.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.