Quantcast
Channel: Configuration Archives - Framboise 314, le Raspberry Pi à la sauce française....
Viewing all articles
Browse latest Browse all 176

Personnaliser NOOBS et ses distributions – 2/3

$
0
0

noobs2_250pxBienvenue dans ce deuxième article consacré à la personnalisation (customisation en français 😉 ) de NOOBS.
Après avoir installé une distribution avec NOOBS, je vous propose de personnaliser une version de Raspbian pour l’adapter à vos besoins. Pour ma part j’ai choisi de fabriquer une Raspbian allégée que j’ai baptisée Frambian… Je vous laisse deviner d’où vient le nom… 😉 Je me suis inspiré de diverses sources (en particulier CNXSoft) que vous retrouvez dans la rubrique Sources, en bas de cet article.

Personnaliser NOOBS : Partie 1Partie 2Partie 3

Personnaliser une distribution Raspbian

Pourquoi Raspbian

raspbian_osMon choix s’est porté sur Raspbian parce que c’est la distribution que j’utilise le plus. J’ai souvent besoin pour des manips ou des tests de mettre en place rapidement une distribution Raspbian. Mais bon, pour ce dont j’ai besoin, les temps de création de la carte sont longs, un tas de paquets inutiles (pour moi) encombrent l’espace disponible sur la carte. Je n’ai pas besoin de l’interface graphique et de tout ce qui tourne autour, ni de Scratch, Mathematica et autres Sonic PI… etc. etc…

Customiser comment ?

verre_moitie_videPour faire une distribution allégée personnalisée on a deux solutions… Le verre à moitié vide et le verre à moitié plein… Quoi, c’est pareil ? Voici comment je vois les choses :

Pour le verre à moitié plein vous démarrez d’un verre vide et vous le remplissez. Si on parle distribution, vous partez de zéro et vous construisez votre distribution à partir de rien (from scratch), vous remplissez le verre. Projet ô combien intéressant en soi mais bon… peut être un peu long à mettre en œuvre.

Pour le verre à moitié vide, vous partez du verre plein (la distribution fonctionnant et complète) et vous enlevez ce qui ne vous sert pas. Pour aboutir au verre à moitié vide aussi, mais en éliminant les paquets inutiles.

Comme je suis Bourguignon d’adoption, je dirai que dans la première solution pour aboutir au verre à moitié plein il faut planter la vigne, la traiter, vendanger, presser les grappes, recueillir le jus, gérer la vinification, mettre en bouteille pour pouvoir enfin verser un demi verre de vin. Et on n’est pas certain d’avoir produit un bon vin. La deuxième solution qui consiste à sortir une bonne bouteille de la cave, verser un plein verre de vin et en boire la moitié me plait beaucoup plus…

C’est donc la deuxième méthode que j’ai retenue : partir d’une Raspbian fraîchement installée et mise à jour, et en enlever les parties que je n’utilise pas. Vous choisirez ce qui vous convient le mieux avec la distribution qui vous intéresse.

Pour aboutir à quoi ?

 L’objectif est une distribution légère qui occupe le minimum de place. Il va aussi falloir préparer les deux partitions qui vont être utilisées par NOOBS pour lancer l’image. Si vous ne voyez pas ce dont je parle, relisez l’article sur le démarrage du Raspberry Pi ou reportez vous au chapitre correspondant de mon livre…

etape_01Au démarrage du système, le CPU est en veille et c’est le GPU qui démarre sur une ROM interne au SoC BCM283x. Il va alors récupérer les fichiers de démarrage (boot loader) sur la partition FAT de la carte SD. c’est ce qui explique la présence de cette partition FAT ! Ensuite, après le chargement et le démarrage du noyau Linux, c’est la partition Linux (ext4) qui travaille (rootfs). La partition FAT est quant à elle montée dans /boot.

Vous y voyez plus clair ?

frambianLe but du jeu après avoir enlevé les parties inutilisées de Raspbian est de récupérer les deux partitions FAT et ext4 séparément dans deux archives au format TAR, puis de  compresser ces archives en xz.

Les anciens comme moi se souviennent de l’utilisation de la commande TAR qui permettait de sauvegarder les données sur bande ou cartouche magnétique (streamer). Ici elle servira à créer l’archive qui sera ensuite passée au format xz avec une compression LZMA.

Préparation d'une distribution pour l'utilisation avec NOOBSChacune des partitions de la carte SD d’origine sera compressée et fournira une archive. Ces deux fichiers archives compressés sont ceux que NOOBS va utiliser pour installer notre distribution. Certains dossiers seront exclus comme /proc qui est un système de fichiers virtuel et contient des infirmations sur le système, /dev/pts qui contient les pseudo-terminaux (pty), et enfin /sys un répertoire virtuel pour les informations système. Nous verrons comment au moment de compresser les partitions.

La partition NOOBS SETTINGS située en haut de la carte SD de NOOBS n’occupe que 32 Mo. C’est une partition  partition ext4 appelée « SETTINGS ». Elle est utilisé pour stocker les fichiers qui informent NOOBS des OS qui sont installés (et sur quelles partitions ils se trouvent), de l’OS qui doit être chargé par défaut, de la langue/clavier que NOOBS utilise, etc…

Pour être à l’aise et pouvoir exécuter sereinement les manipulations suivantes, il vaut mieux avoir 2 cartes microSD : Une pour installer NOOBS, une pour installer Raspbian et le personnaliser. N’oubliez pas non plus que Win32DiskImager permet également de faire une sauvegarde de votre carte microSD et de garder l’archive… au cas où 😉

Alléger Raspbian

Ici encore pas question de réinventer le fil à couper l’eau chaude… Il existe des distributions légères de Raspbian qu’on pourrait utiliser comme Minibian ou Moebius. L’idée c’est plutôt de partir d’une Raspbian complètement à jour (et qui fonctionne) puis de la modifier en lui retirant des éléments. Dans mon cas j’ai choisi de l’alléger mais vous pouvez opter pour d’autres choix. Par exemple un media-center personnalisé, une solution domotique adaptée à vos besoins…

Ne prenez donc pas cette partie de la personnalisation comme une obligation, mais comme une des possibilités existantes parmi tant d’autres…

Installer Raspbian

Bon là on reste classique ! Récupérez la dernière version de Raspbian sur le site de la Fondation. Procédez de la manière habituelle, avec Win32DiskImager. Une fois la carte microSD prête, insérez la dans le connecteur SD du Raspberry Pi, connectez l’écran, le clavier (oubliez la souris !) et mettez sous tension. Pas de configuration particulière avec raspi-config, sauf si la distribution que vous souhaitez préparer nécessite des réglages particuliers. Allez donc directement sur <Finish> et validez.

Dégraisser le mammouth

degraisser-mammouth_minAh non, ça c’était un ancien ministre de l’éducation nationale qui disait ça… Disons que nous allons « soumettre Raspbian à un régime sévère ».

Commençons par regarder la place qu’occupe un Raspbian fraîchement installé (version 2015-05-11) :

pi@raspberrypi ~ $ df -h
Filesystem      Size  Used Avail Use% Mounted on
rootfs          2.9G  2.4G  335M  88% /
/dev/root       2.9G  2.4G  335M  88% /
...
/dev/mmcblk0p1   56M   19M   37M  34% /boot

Notre Root File system (rootfs) n’occupe pas moins de 2,4 Go sur la carte SD.

Pour partir d’un Raspbian à jour il faut passer par

sudo apt-get update
sudo apt-get upgrade

Et on se retrouve avec 2,5 Go occupés sur la carte.

Ensuite un sudo rpi-update pour mettre le firmware à jour également, suivi d’un sudo reboot. Le firmware passe de la version 3.18.11-v7+ à la  4.0.9-v7+. La distribution occupe maintenant 2,6 Go (voir ci dessous)  et nous voilà fin prêt(e)s pour supprimer les paquets inutiles.

pi@raspberrypi ~ $ df -h
Filesystem      Size  Used Avail Use% Mounted on
rootfs          2.9G  2.6G  138M  96% /

J’ai adopté la méthode de Samat, à savoir un script qui recense les paquets à supprimer et qui le fait de façon automatique. Vous pouvez ainsi adapter facilement le script à vos besoins et y ajouter/retrancher ce que vous souhaitez… :

Récupérez le fichier frambian.sh sur framboise314 avec wget ou téléchargez le ici.

pi@raspberrypi ~ $ wget http://www.framboise314.fr/docs/frambian.sh
--2015-07-31 11:48:28--  http://www.framboise314.fr/docs/frambian.sh
Resolving www.framboise314.fr (www.framboise314.fr)... 185.49.20.101
Connecting to www.framboise314.fr (www.framboise314.fr)|185.49.20.101|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1923 (1.9K) [application/x-sh]
Saving to: `frambian.sh'
100%[=======================================>] 1,923       --.-K/s   in 0.001s 2015-07-31 11:48:28 (2.75 MB/s) - `frambian.sh' saved [1923/1923]

Puis modifiez les droits pour qu’il soit exécutable.

pi@raspberrypi ~ $ sudo chmod 750 frambian.sh

Avec nano vous pouvez ajouter/retirer les paquets dont vous avez besoin (ou pas) et personnaliser votre Raspbian à votre sauce. Une fois le script à votre goût, exécutez le :

./frambian.sh

Patientez une vingtaine de minutes, pendant que frambian.sh travaille à votre place 😉

Fin de la précédure
Sys. fich.     Taille Util. Dispo Uti% Monté sur
/dev/root        2,9G  1,1G  1,7G  39% /
devtmpfs         459M     0  459M   0% /dev
tmpfs             93M  248K   93M   1% /run
tmpfs            5,0M     0  5,0M   0% /run/lock
tmpfs            186M     0  186M   0% /run/shm
/dev/mmcblk0p1    56M   20M   37M  36% /boot

Terminer par

sudo apt-get autoremove
sudo apt-get clean

On a encore quelques fichiers à nettoyer (oui je sais, j’aurais pu intégrer tout ça au script mais vous pouvez bien bosser un peu, non?) :

 sudo rm /opt/vc/src/hello_pi/hello_video/test.h264
sudo rm /usr/lib/gcc/arm-linux-gnueabihf/4.6/cc1plus

On peut enlever les paquets dev, listons les dans un premier temps :

root@raspberrypi:/home/pi# sudo dpkg --get-selections | grep "\-dev"
dpkg-dev                                        install
libapt-pkg-dev:armhf                            install
libc-dev-bin                                    install
libc6-dev:armhf                                 install
libept-dev                                      install
libfreetype6-dev                                install
libpng12-dev                                    install
libraspberrypi-dev                              install
libstdc++6-4.6-dev                              install
libtagcoll2-dev                                 install
libwibble-dev                                   install
libxapian-dev                                   install
linux-libc-dev:armhf                            install
manpages-dev                                    install
zlib1g-dev:armhf                                install

Allez zou, on dit qu’on ne fera pas de développement sur ce Raspberry Pi !

sudo apt-get remove `sudo dpkg --get-selections | grep "\-dev" | sed s/install//`

Passez à nouveau un autoremove et un clean : Cette fois un df -h nous indique qu’on tourne aux environs de 970 Mo …

A ce niveau vous pouvez même tenter un sudo reboot avant de supprimer le swap.

Voyons ce que nous dit free :

pi@raspberrypi ~ $ free
total       used       free     shared    buffers     cached
Mem:        948252      57656     890596          0       8452      20936
-/+ buffers/cache:      28268     919984
Swap:       102396          0     102396

On voit que le swap est actif et occupe encore 100 Mo. Occupons nous de son cas !

pi@raspberrypi ~ $sudo dphys-swapfile swapoff
sudo dphys-swapfile uninstall
sudo update-rc.d dphys-swapfile remove
sudo reboot

et on regarde ce que disent df et free :

pi@raspberrypi ~ $ free -htl
total       used       free     shared    buffers     cached
Mem:          926M        55M       870M         0B       8,2M        20M
Low:          926M        55M       870M
High:           0B         0B         0B
-/+ buffers/cache:        27M       898M
Swap:           0B         0B         0B
Total:        926M        55M       870M
pi@raspberrypi ~ $ df -h
Sys. fich.     Taille Util. Dispo Uti% Monté sur
/dev/root        2,9G  867M  1,9G  32% /
devtmpfs         459M     0  459M   0% /dev
tmpfs             93M  240K   93M   1% /run
tmpfs            5,0M     0  5,0M   0% /run/lock
tmpfs            186M     0  186M   0% /run/shm
/dev/mmcblk0p1    56M   20M   37M  36% /boot

On continue en supprimant les python_games qui se planquent dans le dossier /home/pi et qui croyaient qu’on ne les avaient pas vus ! (on va encore gagner 20Mo)

pi@raspberrypi ~ $ sudo rm -r /home/pi/python_games

Allez un dernier petit effort, faites un tour dans /lib/modules.bak : il y a un double des modules qui a été créé lors de la mise à jour rpi-update. On peut aussi supprimer ce répertoire ainsi que l’original et gagner une quarantaine de Mo :

pi@raspberrypi /lib/modules.bak $ sudo rm -r /lib/modules.bak/3.18.11-v7+/
pi@raspberrypi /lib/modules $ sudo rm -r /lib/modules/3.18.*

Vous adapterez bien entendu à la version en service au moment où vous ferez cette manip 😉

Une dernière chose, si vous diffusez votre distribution et que vous ne souhaitez pas qu’on voie tout ce que vous avez tapé précédemment, effacez l’historique :

pi@raspberrypi ~ $ history -c

Pendant que vous avez un système tout propre sous la main, pourquoi ne pas en faire une sauvegarde avec Win32DiskImager ?

oufJe ne sais pas pour vous, mais moi ça commence à me plaire. Notre rootfs est passé de 2,4 Go à 733 Mo (divisé par 3). Ma méthode n’est sans doute pas la meilleure, elle n’est pas optimisée, j’aurais pu améliorer le script, encore enlever d’autres fichiers inutile… etc, etc … J’accepte toutes les critiques ! Et comme disent les gamins : « C’ui qui l’dit c’est c’ui qui y est ! ». Donc si vous savez faire mieux, les pages de framboise314 vous sont ouvertes et j’attends votre article sur la cure d’amaigrissement de Raspbian… Non mais ! 😉

“Ce n’est pas le critique qui est digne d’estime, ni celui qui montre comment l’homme fort a trébuché ou comment l’homme d’action aurait pu mieux faire. Tout le mérite appartient à celui qui descend vraiment dans l’arène, dont le visage est couvert de sueur, de poussière et de sang, qui se bat vaillamment, qui se trompe, qui échoue encore et encore – car il n’y a pas d’effort sans erreur et échec -, mais qui fait son maximum pour progresser, qui est très enthousiaste, qui se consacre à une noble cause, qui au mieux connaîtra in fine le triomphe d’une grande réalisation et qui, s’il échoue après avoir tout osé, saura que sa place n’a jamais été parmi les âmes froides et timorées qui ne connaissent ni la victoire ni l’échec”.

Théodore Roosevelt

theodore_roosevelt

 

NOTA :

  • L’option –purge, passée à la commande autoremove, supprime les paquets indiqués, les dépendances logicielles et leurs fichiers de configuration
  • APT conserve une copie de chaque paquet installé et désinstallé sur carte microSD (dans le dossier /var/cache/apt/archives). L’option clean, option radicale, supprime la totalité des paquets présents dans /var/cache/apt/archives. (Cela n’a aucun impact sur les paquets installés.)

==================== >>  Mise à jour du 6 Août 2015  << ====================

Un lecteur du blog, Karma que je remercie 😉 , me signale qu’il y a un bug signalé quand on enlève le paquet raspberrypi-ui-modshttps://github.com/raspberrypi/documentation/issues/233
« apt-get purge raspberrypi-ui-mods breaks networking components » la suppression de ce paquet supprime également le fichier /etc/network/interfaces utilisé pour les connexions réseau.

Je vous conseille de modifier frambian en rajoutant un fichier interfaces après son installation. Ce bug devrait être corrigé dans une future version, mais vérifiez la présence de /etc/network/interfaces par sécurité…

Ajouter un fichier interfaces

pi@raspberrypi ~ $ cd /etc/network
pi@raspberrypi /etc/network $ ls -al
total 24
drwxr-xr-x  6 root root 4096 janv.  1  1970 .
drwxr-xr-x 96 root root 4096 janv.  1  1970 ..
drwxr-xr-x  2 root root 4096 janv.  1  1970 if-down.d
drwxr-xr-x  2 root root 4096 janv.  1  1970 if-post-down.d
drwxr-xr-x  2 root root 4096 janv.  1  1970 if-pre-up.d
drwxr-xr-x  2 root root 4096 janv.  1  1970 if-up.d
lrwxrwxrwx  1 root root   12 janv.  1  1970 run -> /run/network

Effectivement pas de fichier interfaces en vue. Dans ce dossier, les fichiers appartiennent à root, nous allons donc nous connecter avec le compte root pour créer le fichier manquant.

pi@raspberrypi /etc/network $ sudo su
root@raspberrypi:/etc/network# nano interfaces

et ajoutez ceci au fichier interfaces avant de l’enregistrer (CTRL X) :

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

Ceci devrait éliminer d’éventuels problème de réseau… Merci Karma !

==================== >>  Fin de la Mise à jour du 6 Août 2015  << ====================

Compresser les partitions :

Voici venu le moment de créer nos deux archives destinées à NOOBS : boot.tar.xz et root.tar.xz. Déplacez vous à la racine de votre arborescence :

pi@raspberrypi / $ cd /

Vous pouvez démarrer la réalisation de l’archive de votre rootfs :

pi@raspberrypi / $ sudo tar -cvpf root.tar /* --exclude=proc/* --exclude=sys/* --exclude=dev/pts/* --exclude=run/*

Il faudra quelques minutes pour créer l’archive

On va maintenant la passer en .xz

<code>sudo xz -9 -e root.tar</code>

Comptez un peu plus d’une heure pour que ça mouline tout ça… Vous avez encore de la bière au frigo ? 😉 Bon, il vous reste à la siroter en regardant clignoter la LED ACT…

Vous devriez vous retrouver avec une archive de 170 Mo environ :

-rw-r--r--   1 root root 169346868 août   2 14:31 root.tar.xz

Vous pouvez maintenant passez à la partition /boot (ça devrait aller plus vite, la taille est beaucoup plus petite !)

Au passage voici ce que répond tar s’il lui manque un paramètre 😉

pi@raspberrypi /boot $ sudo tar -cvpf boot.tar
tar: Je refuse de créer un fichier d'archive vide (oui je suis lâche)
Pour en savoir davantage, faites : « tar --help » ou « tar --usage ».

Bon, si on n’oublie pas l’étoile ça fonctionne mieux :

pi@raspberrypi / $ cd /boot
pi@raspberrypi /boot $ pi@raspberrypi /boot $ sudo tar -cvpf boot.tar  *

On obtient un fichier de 20 Mo qu’il ne reste qu’à compresser avec xz :

pi@raspberrypi /boot $ ls -al boot.tar
-rwxr-xr-x 1 root root 20183040 août   2 15:40 boot.tar
pi@raspberrypi /boot $ sudo xz -9 -e boot.tar
pi@raspberrypi /boot $ ls -al boot.tar.xz
-rwxr-xr-x 1 root root 11053916 août   2 15:40 boot.tar.xz

Et ça se termine avec un boot.tar.xz de 11 Mo.

Récupérer les fichiers sur une clé USB

 Pour transférer les archives nouvellement créées, j’ai opté pour un transfert par clé USB. Ça permettra à ceux qui n’ont pas encore fait ce genre de manip de voir comment ça se passe…

La clé USB est utilisée sur diverse machines, elle est donc formatée en FAT, ce qui permet de la passer d’une machine équipée d’un OS libre à une autre dont l’OS est propriétaire. Bon, d’un GNU/Linux à un Windows, quoi…

Première opération, insérer la clé dans un port USB libre du Raspberry Pi. Ma clé est équipé d’une LED qui clignote, indiquant qu’il se passe des trucs.

Sur la console du Raspberry Pi, tapez dmesg. Vous avez sur l’écran l’affichage des messages du noyau.

Avec Linux vous avez un noyau, avec Windows vous n’avez que des pépins 😛

Vous devriez donc obtenir quelque chose de ce genre. Si ce n’est pas le cas, changez de clé. Si ça ne marche toujours pas… je sais pas, moi, brûlez un cierge ou faites une incantation !

[ 8075.943988] usb 1-1.2: new high-speed USB device number 5 using dwc_otg
[ 8076.044977] usb 1-1.2: New USB device found, idVendor=abcd, idProduct=1234
[ 8076.045003] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 8076.045021] usb 1-1.2: Product: UDisk
[ 8076.045037] usb 1-1.2: Manufacturer: General
[ 8076.045053] usb 1-1.2: SerialNumber: \xffffffd0\xffffff89\xffffff89
[ 8076.046280] usb-storage 1-1.2:1.0: USB Mass Storage device detected
[ 8076.048526] scsi host0: usb-storage 1-1.2:1.0
[ 8077.044711] scsi 0:0:0:0: Direct-Access     General  UDisk            5.00 PQ: 0 ANSI: 2
[ 8077.046772] sd 0:0:0:0: [sda] 15728640 512-byte logical blocks: (8.05 GB/7.50 GiB)
[ 8077.047229] sd 0:0:0:0: [sda] Write Protect is off
[ 8077.047258] sd 0:0:0:0: [sda] Mode Sense: 0b 00 00 08
[ 8077.047661] sd 0:0:0:0: [sda] No Caching mode page found
[ 8077.047685] sd 0:0:0:0: [sda] Assuming drive cache: write through
[ 8077.051519]  sda:
[ 8077.054273] sd 0:0:0:0: [sda] Attached SCSI removable disk
[ 8077.082318] sd 0:0:0:0: Attached scsi generic sg0 type 0

En observant la réaction du système on voit bien qu’il s’est rendu compte de quelque chose… Il indique le temps de l’événement entre crochets (c’est le temps en secondes depuis le démarrage du système).

Tiens ! Un nouveau périphérique USB [8075.943988] ! Ah, mais c’est une mémoire de masse [8076.046280] ! Bon, je la connecte sur sda  [8077.046772] (c’est le nom de votre clé pour le système). Ça va, vous suivez ?

Nous allons « monter » (en fait rattacher) la clé USB au système de fichiers pour que Raspbian puisse l’utiliser. Un répertoire est prévu pour ce genre d’opération : /media.

pi@raspberrypi ~ $ sudo  mount  /dev/sda  /media

Vous pouvez vérifier que la clé est bien montée :roll:

pi@raspberrypi ~ $ ls /media
__NOOBS_CUSTOM__
potar.ino
programme_ARDUINO.docx
pwm.jpg
schema_shield.png
shield_multifonctions.jpg

La commande ls affiche bien le contenu de la clé USB, tout va bien.

J’avais créé sur la clé un dossier __NOOBS_CUSTOM__ dans lequel je souhaite copier mes fichiers :

pi@raspberrypi ~ $ cd /media/__NOOBS_CUSTOM__
pi@raspberrypi /media/__NOOBS_CUSTOM__ $ sudo cp /*.xz ./
pi@raspberrypi /media/__NOOBS_CUSTOM__ $ sudo cp /boot/*.xz ./
pi@raspberrypi /media/__NOOBS_CUSTOM__ $ ls -al
total 176188
drwxr-xr-x  2 root root      4096 août   2 15:51 .
drwxr-xr-x 35 root root      8192 janv.  1  1970 ..
-rwxr-xr-x  1 root root  11053916 août   2 15:51 boot.tar.xz
-rwxr-xr-x  1 root root 169346868 août   2 15:51 root.tar.xz
pi@raspberrypi /media/__NOOBS_CUSTOM__ $ sync

Terminez par sync ce qui assure la copie correcte des fichiers sur la clé et vous permet de la retirer sans risquer de l’endommager.

Vous devriez retrouver vos deux fichiers sur la clé USB :

cle_usbPensez à démonter la clé avant de la retirer du port USB du Raspberry Pi.

pi@raspberrypi ~ $ sudo umount /dev/sda

Conclusion

Dans ce deuxième épisode, nous avons vu comment, à partir d’une distribution Raspbian fraichement installée et mise à jour, créer une distribution personnalisée.

Dans le cas que j’avais choisi, la personnalisation s’est faite en enlevant des paquets inutilisés, mais rien ne vous empêche de préparer une distribution dans laquelle non seulement vous supprimerez des paquets, mais vous en installerez d’autres qui vous servent régulièrement.

noobs_FB

A la fin de la personnalisation de Raspbian nous avons récupéré les partitions rootfs et boot sous forme de deux archives compressées qui vont s’intégrer dans NOOBS pour une installation facilitée.

Personnaliser NOOBS : Partie 1Partie 2Partie 3

 Sources


Viewing all articles
Browse latest Browse all 176

Trending Articles