Bienvenue 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 1 – Partie 2 – Partie 3
Personnaliser une distribution Raspbian
Pourquoi Raspbian
Mon 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 ?
Pour 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…
Au 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 ?
Le 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.
Chacune 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
Ah 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 ?
Je 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”. |
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-mods : https://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
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 :
Pensez à 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.
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 1 – Partie 2 – Partie 3
Sources
- https://github.com/raspberrypi/noobs
- https://github.com/raspberrypi/noobs/tree/master/buildroot/package/btrfs-progs
- http://doc.ubuntu-fr.org/tar
- http://blog.qruizelabs.com/2014/04/23/stripping-down-a-standard-raspbian-installation/
- http://www.stefan-seelmann.de/wiki/rasperrypi-homeserver
- https://www.debian.org/doc/manuals/debian-reference/ch07.fr.html
- http://www.cnx-software.com/2012/07/31/84-mb-minimal-raspbian-armhf-image-for-raspberry-pi/
- https://project.altservice.com/issues/418
- http://blog.samat.org/2015/02/05/slimming-an-existing-raspbian-install/
- https://gist.github.com/samatjain/4dda24e14a5b73481e2a
- http://www.i-programmer.info/programming/hardware/7688-real-raspberry-pi-custom-noobs.html?start=1