À l’assaut de Linux From Scratch (partie 3)

Pour ce troisième chapitre, je ne saurais trop vous conseiller de travailler avec le livre en version anglaise plutôt qu’avec sa traduction française. Cette dernière est bien faite mais on y trouve quelques approximations qui compliquent le processus. En ce qui concerne la mise en page de la version PDF, elle n’est pas toujours soignée. Donc, je vous suggère de travailler avec la version HTML du manuel, qui est bien plus aérée.

Lire la suite de « À l’assaut de Linux From Scratch (partie 3) »

À la découverte de Linux From Scratch (partie 2)

2. Le partitionnement

Pour installer Linux From Scratch, il faut commencer par créer des partitions sur un disque dur. Ce dernier peut être vierge ou bien déjà partitionné. S’il reste suffisamment d’espace libre pour pouvoir accueillir notre petite distribution moulée à la louche, ça fera l’affaire. Personnellement, j’ai choisi le deuxième disque dur de mon ordinateur, d’une capacité de 80 GB, ce qui est largement suffisant pour:

  • créer une partition de 30 GB destinée à accueillir les fichiers de configuration et qui sera montée à la racine du système,
  • créer une partition de 8 GB destinée à accueillir la SWAP, c’est-à-dire la partition d’échange.

Quant à mon répertoire personnel, il est déjà monté sur /home et il se trouve sur le premier disque dur de mon ordinateur.

Pour partitionner, vous pouvez utiliser cfdisk (en ligne de commande), gnome-disks ou bien gparted. Pour ma part, j’ai utilisé gnome-disks mais là, je vais vous montrer en ligne de commande avec l’utilitaire cfdisk. Tout d’abord, nous passons en root:

[miamondo@volgor ~]$ su
Mot de passe :
[root@volgor miamondo]#

Commençons par identifier le disque dur. Il ne s’agit pas de formater le mauvais support! Vous pouvez utiliser fdisk -l ou bien lsblk, laquelle nous retourne ces informations:

[root@volgor miamondo]# lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
fd0      2:0    1     4K  0 disk 
sda      8:0    0 931,5G  0 disk 
├─sda1   8:1    0    35G  0 part /
├─sda2   8:2    0     8G  0 part [SWAP]
└─sda3   8:3    0 888,5G  0 part /home
sdb      8:16   0  74,5G  0 disk 

Le disque à partitionner est /dev/sdb. Sachant cela, entrons maintenant la commande suivante:

[root@volgor miamondo]# cfdisk /dev/sdb

Voici ce qui s’affiche:

L’image ci-dessous montre le résultat que nous devons obtenir.

Pour ce faire, il faut d’abord cliquer sur Nouvelle puis renseigner la taille de la partition sdb1 (30G). Normalement, le type par défaut est ext4. Laissez-le tel quel, et cliquer sur Écrire. Vous allez voir apparaitre une magnifique erreur de traduction présente depuis la nuit des temps: La table de partitions a été altérée. Oh la! Ça pique les yeux! Alors, la traduction française du verbe anglais to alter est modifier, et la traduction anglaise du verbe français altérer est to corrupt. Donc, si on vous dit que votre table de partitions a été corrompue, c’est que tout va bien!

Il y a maintenant deux lignes : /dev/sdb1 et Espace libre. Mettons Espace libre en surbrillance et renouvelons l’opération pour créer la partition d’échange (SWAP). Donc, Nouvelle puis 8G (ou 4G, tout dépend de la capacité de votre RAM). Puis cliquez sur Type et sélectionnez Partition d’échange Linux. Enfin, confirmez en cliquant sur Écrire.

Il reste de l’espace libre. Vous pouvez fort bien créer une troisième partition pour votre répertoire personnel. Son système de fichiers sera ext4 et elle sera montée sur /home. Moi, je laisse comme ça, car j’utiliserai mon répertoire personnel qui se trouve sur le disque dur principal de mon ordinateur. Les esprits perspicaces auront remarqué qu’aucune partition n’est amorçable. Nous allons nous en occuper plus tard.

Pour une meilleure compréhension mutuelle, la première partition doit être étiquetée LFS. Vous pouvez faire cette opération en ligne de commande:

[root@volgor miamondo]# e2label /dev/sdb1 LFS

Maintenant, il faut initialiser le système de fichiers de chaque partition.

[root@volgor miamondo]# mkfs.ext4 /dev/sdb1
[root@volgor miamondo]# mkswap /dev/sdb2

Si vous avez d’ores et déjà créé une troisième partition dont le point de montage sera /home, entrez cette commande.

[root@volgor miamondo]# mkfs.ext4 /dev/sdb3

3. Définir la variable $LFS

Toujours en root, nous allons définir une variable d’environnement qui va correspondre au point de montage /mnt/lfs. Ce sera en quelque sorte, la porte entre le système hôte et le système LFS. Cette variable d’environnement va s’appeler LFS.

export LFS=/mnt/lfs

Il vous est loisible de choisir un autre nom que /mnt/lfs, par exemple /mnt/mickey ou bien /mnt/truc_de_ouf. Ça fonctionnera quand-même. Moi, je vais m’en tenir au sobre mais explicite /mnt/lfs.

Donc, vous allez ouvrir et rajouter cette variable d’environnement dans quatre fichiers différents. Si un de ces fichiers n’existe pas, créez-le.

  • /home/user/.bashrc (remplacer user par le nom de votre répertoire personnel)
  • /root/.bashrc
  • /home/user/.bash_profile (remplacer user par le nom de votre répertoire personnel)
  • /root/.bash_profile

Attention! Dans les fichiers .bashrc, la variable d’environnement que nous avons définie doit être rajoutée avant les lignes suivantes, et pas à la fin des fichiers. Ne me demandez pas pourquoi, c’est au-delà de mes compétences mais vous trouverez une explication détaillée dans le manuel, au chapitre 2.6.

# If not running interactively, don't do anything
[[ $- != *i* ]] && return

Au final, les fichiers modifiés .bashrc doivent ressembler à ceci:

# ~/.bashrc

export LFS=/mnt/lfs

# If not running interactively, don't do anything
[[ $- != *i* ]] && return

alias ls='ls --color=auto'
PS1='[\u@\h \W]\$ '

BROWSER=falkon
TERM=xterm
EDITOR=pycharm

Voilà… Nous avons rajouté notre variable d’environnement dans quatre fichiers différents, ce qui nous assure qu’elle sera toujours définie. Pas de surprise à attendre. On est ceinture-bretelles! Pensez à recharger le profil avec la commande source, pour activer la variable et faites un essai dans le terminal (en root). Appelez-la:

[root@volgor miamondo]# source /home/miamondo/.bash_profile
[root@volgor miamondo]# source /root/.bash_profile
[root@volgor miamondo]# echo $LFS
/mnt/lfs

Vérifiez maintenant que le shell indiqué dans le fichier /etc/passwd est bien bash. C’est important. Nous allons à présent monter la partition au point de montage $LFS puis activer la partition d’échange SWAP. Mais d’abord, il faut créer le répertoire $LFS. Il n’existe pas encore. /mnt est vide.

[root@volgor miamondo]# mkdir -p $LFS
[root@volgor miamondo]# ls /mnt      # petite vérification...
lfs                                  # Le répertoire a été créé
[root@volgor miamondo]# mount /dev/sdb1 $LFS   
[root@volgor miamondo]# swapon /dev/sdb2 

4. Téléchargement des paquets et des correctifs

Notre partition est montée. Cela signifie que nous avons entamé les premiers travaux de construction de notre système. Si on compare avec une maison d’habitation, nous avons effectué le terrassement. Nous arrivons maintenant à un point du livre que je n’ai pas trouvé très clair, en l’occurrence le téléchargement des archives *.tar, lesquelles vont nous permettre de continuer notre belle mission de bâtisseur.

Pour ce faire, nous allons d’abord créer un répertoire sources. Il accueillera toutes les archives et aussi les quelques correctifs (patch). Comme les archives *.tar vont être stockés sur la partition LFS, elles seront toujours à portée de clavier. En fait, c’est comme si nous étions en train de faire livrer tous les matériaux sur le chantier.

Tout d’abord, créons le répertoire sources.

[root@volgor miamondo]# mkdir $LFS/sources

Ensuite, on active le droit d’écriture et le droit sticky sur ce répertoire. « Sticky » signifie que même si de nombreux utilisateurs peuvent écrire sur un répertoire, seul le propriétaire du fichier peut supprimer ce fichier à l’intérieur du répertoire sticky.

[root@volgor miamondo]# chmod -v a+wt $LFS/sources

Ensuite, c’est là que le livre devient obscur… Nous allons passer au téléchargement des archives *.tar. Peut-être y-a-t-il un problème de traduction. Je ne sais pas trop… La version anglaise me semble plus claire. Finalement, j’ai réussi à trouver la liste des archives de la version 10.10 téléchargeable à partir d’un miroir situé en Allemagne, mon lieu de résidence. L’instruction est sur une seule ligne. Vous n’avez pas à vous occuper du retour chariot.

[root@volgor miamondo]# wget --input-file="http://ftp.wrz.de/pub/LFS/lfs-packages/10.0/" --continue --directory-prefix=/mnt/lfs/sources

Et là, on peut dire que c’est la fête des couleurs. Un feu d’artifice illumine l’écran! Quel magnifique spectacle que ces archives aux couleurs de l’arc-en-ciel effaçant l’obscurité pour s’offrir à notre regard d’enfants ébahis. Mon Dieu, les larmes me montent aux yeux. Pardonnez-moi…

C’est d’autant plus beau que même les correctifs ont été téléchargés. Ce sont les fichiers de couleur blanche. Nous allons maintenant vérifier que tout s’est bien passé grâce à ces instructions:

[root@volgor miamondo]# pushd $LFS/sources
[root@volgor miamondo]# md5sum -c md5sums
[root@volgor miamondo]# popd

À présent, nous allons faire une longue pause. Il est l’heure d’aller dormir. Nous allons démonter la partition /dev/sdb1 avant d’éteindre l’ordinateur et nous continuerons demain…

[root@volgor miamondo]# umount /dev/sdb

Tiens! On est déjà demain? Mon Dieu, que le temps passe vite! Hop! Debout les morts! Il est sept heures. Une nouvelle journée commence. Avant de boire une bière, Première opération, on ouvre un terminal, on passe en root et on remonte la partition /dev/sdb1.

[miamondo@volgor ~]$ su
Mot de passe : 
[root@volgor miamondo]# mount /dev/sdb1 $LFS

Ensuite, nous allons créer plusieurs répertoires qui vont nous être nécessaires par la suite.

[root@volgor miamondo]# mkdir -p $LFS/{bin,etc,lib,sbin,usr,var,tools}
[root@volgor miamondo]# if [ "`uname -m`" = "x86_64" ]
>then
>   mkdir -p $LFS/lib64    # Architecture 64-bit
>fi

Vérifions si tout s’est déroulé comme prévu. Nous constatons que notre distribution embryonnaire s’étoffe! Vous noterez que nous avons créé un répertoire tools. Je ne peux pas vous en dire plus pour le moment puisque je découvre avec vous. Sachez simplement qu’un compilateur croisé sera installé dans ce répertoire car il doit être isolé des autres programmes.

[root@volgor miamondo]# ls $LFS
bin  etc  lib  lib64  lost+found  sbin  sources  tools usr  var

5. Ajouter un utilisateur

Pour la suite des festivités, nous n’allons pas continuer en root. C’est beaucoup trop dangereux. Nous allons donc créer un utilisateur que le manuel préconise de nommer lfs. Personnellement, comme je trouve qu’il y a beaucoup de lfs et que ça va finir par être source de confusion, j’ai choisi d’appeler cet utilisateur benoit. C’est mon prénom.

[root@volgor miamondo]# groupadd benoit
useradd -s /bin/bash -g benoit -m -k /dev/null benoit

Ensuite, je m’attribue un mot de passe:

[root@volgor miamondo]# passwd benoit
Nouveau mot de passe : 
Retapez le nouveau mot de passe : 
passwd: password updated successfully

Ensuite, je donne à benoit un accès complet aux répertoires de $LFS en indiquant que benoit est le propriétaire du répertoire :

[root@volgor miamondo]# chown -R benoit $LFS/{bin,etc,lib,sbin,usr,var,tools}
[root@volgor miamondo]# if [ "`uname -m`" = "x86_64" ]
>then
>   chown -R benoit $LFS/lib64    # Architecture 64-bit
>fi

N’oublions pas également le répertoire sources. Dans la foulée, on va vérifier que le changement de propriétaire s’est bien passé. Puis, on va se connecter en tant que benoit, delphonse, amandale ou patriste. Cela dépend de votre prénom.

[root@volgor miamondo]# chown benoit $LFS/sources
[root@volgor miamondo]# ls -l $LFS
[root@volgor miamondo]# su - benoit
[benoit@volgor ~]$       # invite de commande modifiée

6. Configuration de l’environnement

La commande ci-dessous, ou plutôt le script, nous assure qu’aucune variable d’environnement non souhaitée et potentiellement dangereuse, provenant du système hôte, ne parvienne dans l’environnement de construction. Celui-ci doit être propre.

[benoit@volgor ~]$ cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF

Ensuite, nous créons le fichier caché .bashrc. Je vous invite à consulter la page 32 du manuel pour avoir une explication détaillée des différentes commandes de ce fichier. Mon but n’est pas de recopier le manuel mais de décrire les étapes du processus.

[benoit@volgor ~]$ cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/usr/bin
if [ ! -L /bin ]; then PATH=/bin:$PATH; fi
PATH=$LFS/tools/bin:$PATH
export LFS LC_ALL LFS_TGT PATH
EOF

Ensuite, nous chargeons le profil du nouvel utilisateur.

[benoit@volgor ~]$ source ~/.bash_profile

Dernière opération très importante. Après avoir basculé en root, il faut neutraliser le fichier /etc/bash.bashrc en le renommant provisoirement, pour éviter qu’il n’affecte gravement la construction des paquets critiques. Vous trouverez plus d’explications au chapitre 4.4. du manuel officiel.

[root@volgor miamondo]# [ ! -e /etc/bash.bashrc ] || mv -v /etc/bash.bashrc /etc/bash.bashrc.NOUSE

Ouf! Terminé pour cette deuxième partie. Dans le prochain chapitre, cela va se corser un peu car nous allons construire un compilateur croisé et commencer à vraiment bâtir le système. Ce troisième chapitre demandera beaucoup d’attention et de calme. Lisez attentivement les instructions et consultez le manuel officiel en français. Ça ne sert à rien de foncer. On a le temps.

À la découverte de Linux From Scratch (partie 1)

La semaine dernière, tandis que je baguenaudais sur le web, j’ai découvert Linux From Scratch couramment abrégé en LFS. J’ai longtemps cru qu’il s’agissait d’un langage de programmation destiné aux enfants. Mais ce dernier s’appelle Scratch tout court et il ne faut pas le confondre avec LFS qui est un projet complètement différent.

Lire la suite de « À la découverte de Linux From Scratch (partie 1) »

Utiliser Git comme outil de sauvegarde et d’infonuagique ?

Git est une forge, c’est-à-dire un outil collaboratif qui permet à des développeuses (ou des développeurs) de travailler sur un projet commun et de le versionner. Ce système, doté de nombreux outils annexes, est très pratique car il permet d’isoler facilement les bugs et de les traiter. Git garde la trace de toutes les modifications. On peut utiliser Git pour développer un logiciel ou pour écrire un roman. Si vous modifiez un chapitre et que trois semaines plus tard, vous avez des regrets, pas de problème! Vous pouvez retrouver la version et ressusciter un personnage qu’entretemps vous avez assassiné pour les besoins de l’intrigue.

Lire la suite de « Utiliser Git comme outil de sauvegarde et d’infonuagique ? »

Les deux chemins qui s’offrent à l’humanité (2)

Essai de politique-fiction

Deuxième chemin: la disparition des états-nations et l’avènement du contrat terrien

Tandis que les premiers colons qui auront été déclarés aptes et non contaminés, embarqueront pour la planète Mars, la Terre continuera de s’enfoncer dans la violence et le chaos. Le COVID-19, sous le contrôle d’une force mystérieuse, sera frappée par une succession de mutations incontrôlables qui mettront fin à tout espoir de vaccin. Des centaines de millions de mort joncheront les rues, aggravant la situation sanitaire. La population terrienne diminuera inexorablement. Les villes, où la violence sera omniprésente, seront abandonnées. Les états-nations, rongés de l’intérieur, s’écrouleront les uns après les autres.

Lire la suite de « Les deux chemins qui s’offrent à l’humanité (2) »

DWService, une application de télémaintenance originaire d’Estonie

DWService est une application de télémaintenance qui nous vient d’Estonie. C’est une alternative libre à TeamViewer. Elle permet entre autre de prendre le contrôle d’un ordinateur à distance.


Lire la suite de « DWService, une application de télémaintenance originaire d’Estonie »

Lancer plusieurs processus sans utiliser de threads (Labortablo – 3ème partie)

Mon ordinateur est équipé de deux écrans. Par conséquent, j’ai fait en sorte que mon interface de bureau moulé à la louche, prenne en compte ce cas de figure. Dans un premier temps, j’ai utilisé le module multiprocessing. Cela me semblait être la solution idéale pour lancer simultanément un process sur chaque écran.

Seulement, il y a un léger problème. threading et multiprocessing rentrent en conflit avec des interfaces graphiques telles que tkinter. Le résultat final présente des signes d’instabilité qui ne sont pas du meilleur effet. En théorie, on peut utiliser multiprocessing avec tkinter mais toutes les interactions avec l’interface graphique doivent se faire par un seul et unique thread. Le module multiprocessing peut traiter des données et faire des calculs dans plusieurs threads, mais il ne peut pas « multithreader » tkinter! Les deux processus doivent être séparés.

Donc, dans un souci d’amélioration continue, je me suis mis en quête d’une solution alternative, et je pense avoir codé quelque chose qui comble mes attentes en terme de stabilité. Alors comment ai-je procédé? En fait, je suis parti de l’idée toute simple que pour deux écrans, il faut avoir non pas deux threads d’un même programme mais deux programmes! Et je voulais que tout le processus se déroule de manière automatique. Pas question pour l’usager, d’ouvrir un fichier de configuration pour en modifier le contenu. L’objectif était vraiment de coder quelque chose qui s’installe tout seul et qui vit sa vie sans intervention de maintenance. Mais comment faire pour donner l’illusion de lancer et d’arrêter deux threads?

  1. Situation initiale

Voici la configuration initiale avec multiprocessing.

2. Suppression de multiprocessing, modification du code et explications détaillées

Au démarrage de l’ordinateur, le programme se lance grâce au fichier start.py dont le chemin se trouve dans ~/.config/openbox/autostart.

Examinons, si vous le voulez bien, ce script. La première opération qu’il exécute, consiste à détruire tous les fichiers et répertoires antérieurs qui ne correspondent pas à la configuration par défaut (en monomoniteur, si vous me permettez ce néologisme). Il est nécessaire de partir sur une base propre:

Version standard monomoniteur

Pourquoi détruire la configuration multi-écrans à chaque démarrage? Eh bien parce que l’utilisateur peut très bien décider, un beau matin, de suppprimer un écran ou d’en rajouter un troisième. Je ne suis pas dans sa tête et je ne connais pas ses intentions.

Ensuite, vient le moment de déterminer le nombre de moniteurs. Plutôt que de compter avec ses doigts, confions cette tâche à la commande suivante:

xrandr --listactivemonitors

Résultat:

Monitors: 4
 0: +*HDMI-1 1920/698x1080/392+1920+0  HDMI-1
 1: +VGA-1 1920/477x1080/268+0+0  VGA-1
 2: etc...
 3: etc...

Je crois que c’est clair… Maintenant, le programme va créer autant de répertoires qu’il y a de moniteurs supplémentaires, et il va copier le contenu de labortablo dans chacun d’entre eux. Si vous avez quatre écrans, il va donc créer en sus de labortablo (qui est en quelque sorte le « répertoire zéro« ):

  • labortablo_1
  • labortablo_2
  • labortablo_3

Nous nous retrouvons donc avec cette configuration:

Version quadrimoniteur

Voici la ligne de code qui effectue cette opération:

if i > 0:
    shutil.copytree(
        f'{self.cwd}/labortablo',
        f'{self.cwd}/labortablo_{i}'
        )

De cette manière, si je veux apporter des modifications au code avant de le pousser dans mon dépôt Git, il me suffit de modifier labortablo, le « répertoire zéro ». Je sais qu’au prochain démarrage, les modifications seront prises en compte pour tous les autres programmes.

Ensuite le script start.py se charge de traiter les informations relatives aux écrans. Puis, il créé un fichier coords.txt pour chaque interface de bureau. Ce fichier est construit de telle sorte qu’il puisse se transformer très facilement en dictionnaire. Je trouve que cette syntaxe facilite bien la vie.

w:1920   # largeur
h:1080   # hauteur
x:0      # abscisse
y:0      # ordonnée

Ainsi, je peux passer rapidement ces paramètres aux classes qui en ont besoin. Tous les éléments graphiques vont récupérer ces informations pour configurer l’interface de bureau sur chaque écran.

args = dict()
with open('coords.txt', 'r') as rfile:
    for line in rfile.readlines():
        args[line.split(':')[0]] = int(line.strip().split(':')[1])

Le moment est venu de créer le fichier start.sh. Il va contenir tous les programmes à lancer et il sera détruit au prochain démarrage. Donc, dans le cas de figure ou il y a quatre écrans, voici à quoi ressemble ce script:

#!/bin/bash

/home/miamondo/chemin/vers/labortablo/taskbar.py &
/home/miamondo/chemin/vers/labortablo/categories.py &
/home/miamondo/chemin/vers/labortablo_1/taskbar.py &
/home/miamondo/chemin/vers/labortablo_1/categories.py &
/home/miamondo/chemin/vers/labortablo_2/taskbar.py &
/home/miamondo/chemin/vers/labortablo_2/categories.py &
/home/miamondo/chemin/vers/labortablo_3/taskbar.py &
/home/miamondo/chemin/vers/labortablo_3/categories.py &

Alors, vous allez me dire qu’il ne s’agit pas d’un script Python. Par conséquent, je ne devrais pas affirmer que Labortablo est une interface de bureau entièrment codée en Python. C’est vrai. Je le reconnais. Mais je n’ai pas d’autres choix si je veux lancer mon métaprogramme. On peut très bien lancer des fichiers *.py à partir d’un fichier Python mais j’ai ouï-dire que ce genre d’hérésie conduisait tout droit au bûcher.

Avec Python, on lance des modules, pas des fichiers, et à ce stade des opérations, je ne peux pas car il faudrait que j’utilise threading ou multiprocessing. C’est le python qui se mord la queue!

Enfin, dernière opération, je rend le fichier start.sh exécutable. Il faut le faire à chaque fois car il est détruit à chaque démarrage. Puis start.sh est lancé par start.py.

Conclusion

J’ai bien conscience du fait que cette manière de procéder est loin d’être académique mais d’une part, je m’en fiche un peu, et d’autre part ça tourne comme une horloge. J’utilise cette interface de bureau tous les jours, non pas dans une machine virtuelle mais sur mon PC principal. Il faut encore que je lui rajoute la gestion des catégories et des applications (ajouts/suppressions). Il faut aussi que je fasse le point sur tout ce qu’il y a à installer pour faire tourner le programme (xrandr, wmctrl, xprop etc…)

Voilà… Je n’oublie pas de vous souhaiter un Joyeux Nowouel et une bonne vaccination à toutes et à tous.