31. Just sudo it

Un petit article pour préciser divers usages du compte root.

Comme le dit le titre, il est tout-à-fait possible, et souvent nécessaire, de réaliser des opérations en mode de Super Utilisateur : su. Plusieurs possibilités s’offrent à nous.

  • sudo, qui est une manière de gérer l’accès d’un utilisateur courant à certaines commandes réservées au super utilisateur,
  • sudo -s, …
  • sudo -i, …
  • sudo su … et
  • su, qui offre un accès complet et sans limites au système.

Accès au super utilisateur

Généralement, il n’est pas nécessaire de se connecter su le compte root. Non seulement cela peut être risqué en raison des erreurs qu’on peut y commettre, mais aussi pour des raisons de sécurité.

La commande sudo est donc généralement celle utilisée pour effectuer des opérations spécifiques nécessitant le lancement d’une unique commande, comme la mise-à-jour des paquets par exemple. Cette commande est hautement paramétrable grâce à l’utilitaire visudo, qui ne sera pas décrite ici, mais qui permet d’attribuer une ou plusieurs commandes à faire sous root, à un utilisateur particulier.

sudo -s, est une commande donnant accès au commandes du compte root, mais pas au compte root. Les variables d’environnement, le répertoire root, le changement du mot de passe root, … ne sont pas accessibles.

sudo -i va un peut plus loin que sudo -s. C’est le mot de passe utilisateur qui est toujours demandé et les commandes restent déléguées par setuid root, mais le shell est initialisé comme au login de l’utilisateur.

sudo su est totalement identique à sudo root, décrit ci-dessous, à l’exception que le mot de passe demandé sera celui de l’utilisateur référencé dans les sudoers. Ainsi, il est possible, pour autant qu’on y soit autorisé, de se connecter en root sans connaître le mot de passe root.

Enfin la commande su, qui est identique à su root (on peut aussi faire su unautreutilisateur), remplace l’utilisateur courant par le super utilisateur, avec tous ses pouvoirs. C’est très pratique, mais nécessite de connaître le mot de passe du super utilisateur.

Gestion des comptes

Par ailleurs, il est nécessaire d’évoquer ici la gestion des comptes et mots de passe dans le cadre du super utilisateur. Notamment, la possibilité d’imposer des changements de mots de passe ou de désactiver des comptes après un temps donné.

La commande « chage » sert à « modifier les informations de validité d’un mot de passe ». Un man chage nous fournit la description suivante :

« La commande chage modifie le nombre de jours entre les changements de mot de passe et la date du dernier changement. Ces informations sont
utilisées par le système pour déterminer si un utilisateur doit changer son mot de passe. »

man chage

Ainsi, si vous êtes confrontés, lors d’une tentative de vous connecter en super utilisateur via la commande su, à une information spécifiant que le compte a été désactivé, c’est que l’administrateur à trouvé nécessaire de vous obliger à reconsidérer votre accès au compte à un moment donné ou au bout d’un certain temps.

La désactivation de l’obligation de changer le mot de passe root se fait par la commande :

chage -E -1 -I -1 -M -1 root

dont l’explication est la suivante :

  • -E : date d’expiration du compte ; -1 supprime l’expiration,
  • -I : durée d’inactivité avant le blocage du compte ; -1 supprime cette durée d’inactivité,
  • -M : nombre de jours maximums pendant les quels un mot de passe est valable ; -1 supprime cette durée.

Voilà pour ces quelques précisions.

Raspberrypi imager

Un tout petit article pour signaler, comme le fait l’article https://www.minimachines.net/actu/raspberry-pi-imager-1-6-98196, que l’utilitaire fort pratique pour créer une image de Rasbpian sur une carte SD (disponible sur Raspberrypi, mais aussi sur Debian) « Raspberrypi imager » dispose d’un mode avancé. Pour y accéder, il faut appuyer simultanément sur <CTRl><SHIFT><X>. On peut alors choisir le nom de la machine, choisir d’activer ssh, choisir un mot de passe, configurer le wifi et les locales avant même l’installation sur la carte sd. Cela est très pratique avec des élèves, car cela évite de devoir passer par la phase de configuration post-installation.

Voilà. Cet utilitaire est vraiment très bien fait.

Présentation du Librem 5

Introduction

Cet article inaugure une série d’articles consacré au Librem 5, le téléphone de la société Purism (https://puri.sm/products/librem-5/) brièvement décrit sur Wikipedia : https://fr.wikipedia.org/wiki/Librem_5.

Il s’agit d’un téléphone libre, utilisant le système d’exploitation PureOS, un dérivé direct de Debian. Je l’ai reçu le 17 mars 2021, après une prè-commande de 3 ans. Il est intéressant de souligner ce fait, par comparaison avec le taux de changement des téléphones qui est de cet ordre de grandeur et celui des ordinateurs qui est aujourd’hui un peu plus long, sans l’être beaucoup plus. Cela n’a pas été un problème pour moi étant donné que le contenu et les objectifs du projet étaient évidemment bien plus important que l’immédiateté de la possession.

Hardware

La première impression fut que ce téléphone était lourd. Mon téléphone précédent est un Fairphone 2 tournant sous /e/OS dont l’écran est plus petit et il est bien plus léger. Ma femme ayant un Fairphone 3 d’une grandeur comparable au Librem 5, comparaison faite, les deux sont aussi lourds. Du point de vue de la forme, de la masse et de la taille, le Librem 5 est donc très semblable à un Fairphone 3.

Un important problème est rapidement survenu. La batterie étant chargée à moins de 20%, j’ai voulu le mettre en charge immédiatement. Or, malgré une nuit complète, il a été finalement totalement déchargé. Après avoir testé différents câbles USBC, je me suis résolu à tester le chargeur fourni. Impossible de le faire fonctionner. C’est en utilisant l’alimentation de mon Raspberrypi que le Librem s’est mis à charger. Malgré une alimentation à 3 ampères, il a fallu une autre nuit pour qu’il soit totalement chargé.

Là se sont arrêtés mes problèmes de hardware. Mais j’ai pu constater alors que des problèmes liés à la batterie pouvaient exister et que plusieurs méthodes de résolution sont évoquées dans la documentation : https://docs.puri.sm/

Software

Venons-en maintenant à la saga des problèmes logiciels. Je ne dis pas « saga » par ironie, car pour moi le chemin est plus important que le but et j’espère que cette saga va continuer tant j’apprécie être confronté à toute sorte de défis techniques.

Avant toute chose, il faut bien comprendre ce qu’est le Librem. L’immense majorité des téléphones fonctionnent aujourd’hui sous Android. Même si le noyau est linux, Android utilise Java pour fonctionner. Or, Java est lourd et souvent inutile. Le Librem est un téléphone très original, car il se passe de Java. Au même titre que le Raspberrypi, le Librem fonctionne sur ARM nativement. De plus, ce téléphone est vraiment libre. Le pilote de sa carte graphique est par exemple libre, ce qui n’est pas la moindre des choses. Enfin, il est l’héritier de la branche Debian des distributions linux. Cela signifie qu’on a accès à l’ensemble des logiciels prévus pour Debian, Mint ou Ubuntu. Cela en fait un téléphone au potentiel exceptionnel. Reste qu’il n’est pas facile de reporter tout cela sur un téléphone, surtout du point de vue des interfaces graphiques dont les dimensions sont très souvent prévues pour de plus grands écrans et du point de vue de l’interaction tactile. En effet, quand un logiciel s’adapte correctement à l’écran d’un téléphone, cela ne veut pas dire que le clique droit ou que l’appui long soit correctement implémenté. Beaucoup de problèmes de ce type restent donc à régler. Mais, remarquez que même si ceux-ci ont été et sont encore nombreux, le résultat est déjà aujourd’hui largement supérieur à mes attentes, surtout avec la « Convergence » (possibilité d’utiliser mon téléphone comme un ordinateur normal) et je suis enchanté de mon investissement.

Conclusion

Le librem 5 n’est pas un téléphone à mettre entre toutes les mains, car il faut une bonne expérience de linux et de la ligne de commande pour affronter les principaux problèmes qui se présentent encore. Si l’objectif est l’utilisation de ce téléphone uniquement comme tel, un Fairphone avec /e/OS est bien plus adapté à l’heure actuelle. Par contre, pour en faire un véritable ordinateur de bureau qui soit simultanément un téléphone, il est déjà très réussi.

Dans la suite des articles que je vais consacrer au Librem 5, je vais aborder les principaux problèmes que j’ai rencontrés, ce qui permettra de mettre en évidence les faiblesses actuelles du téléphone qu’il faut bien évidemment reconnaître, mais aussi les point forts de l’ordinateur et de son système d’exploitation PureOS.

30. Systemd utilisateur

Ceci n’est pas un article sur systemd, mais la présentation d’une utilisation très pratique de systemd par un utilisateur pour lancer une commande avec systemd au lancement de la session de l’utilisateur. L’article sur lequel je me suis basé pour réaliser ce que je voulais est : https://medium.com/@alexeypetrenko/systemd-user-level-persistence-25eb562d2ea8

Mon problème était le suivant : je dispose d’un clavier bluetooth récupéré d’une tablette obsolète. Or ce clavier ne dispose pas de la touche backslash (\). C’est extrêmement désagréable pour quelqu’un qui pratique intensivement LaTeX.

Il s’agissait donc de lancer une modification du clavier à chaque lancement de session. Pour cela il fallait d’abord savoir comment affecter la touche backslash à l’une des touches libre de mon clavier. Après quelques recherches, le logiciel permettant cette modification a été trouvé et la commande suivante testée fonctionnelle :

xmodmap -e 'keycode 202=backslash' & 

Xmodmap permet d’affecter une touche physique, ici la touche 202, à un caractère, ici backslash. Pour déterminer le code de la touche, la commande suivante est nécessaire :

xev -event keyboard

Une fois lancée, en pressant sur une touche, on obtient un retours comme :

KeyPress event, serial 25, synthetic NO, window 0x3a00001,
    root 0x389, subw 0x0, time 5876177, (922,180), root:(924,260),
    state 0x0, keycode 202 (keysym 0x5c, backslash), same_screen YES,
    XLookupString gives 1 bytes: (5c) "\"
    XmbLookupString gives 1 bytes: (5c) "\"
    XFilterEvent returns: False

dans lequel figure « keycode 202 » (ici déjà affectée à backslash). L’esperluette (&) de la fin de commande permettait de lancer la commande pour une session, ce que systemd va nous permettre de faire automatiquement et cela sans aucun droits de superutilisateur.

Venons en donc à systemd. À l’instar des services lancés par systemd pour root, l’idée est de mettre dans le répertoire (à créer au besoin) :

.config/systemd/user/

un fichier de service à lancer au démarrage de la session. Dans mon cas, le nom de ce fichier sera évidemment « backslash.service » puisque ce service va me permettre de disposer de la touche backslash. Son contenu sera le suivant :

[Unit]
Description=Just for backslash character

[Service]
ExecStart= /usr/bin/xmodmap -e 'keycode 202=backslash'
Restart=always
RestartSec=60

[Install]
WantedBy=default.target

Les lignes de restart signifient qu’en cas de problème le démon est relancé au bout de 60 secondes.

Pour installer le service, il faut alors utiliser la commande :

systemctl --user enable backslash.service

Un certains nombre de liens seront créé pour que systemd puisse lancer le service au démarrage de la session.

Pour démarrer le démon sans relancer la session, il faut classiquement faire :

systemctl --user start backslash.service

Si cela ne fonctionne pas, comme ce fut le cas pour moi, lancez :

systemctl --user status backslash.service

L’état du service vous sera retourné et vous verrez apparaître un « Failure » si la commande de votre service est mauvaise. En l’occurrence, pour moi, ce fut le fait qu’il fallait mettre le chemin complet vers xmodmap, soit /user/bin/xmodmap.

Enfin, après avoir corrigé les problèmes, un :

systemctl --user restart backslash.service

ne suffit pas. Il faut encore recharger l’ensemble des démons de l’utilisateur par :

systemctl --user daemon-reload
Voilà. Systemd peut donc être très utile au niveau utilisateur pour remettre en place des fonds d'écran par exemple ou tout autre commande à lancer au démarrage de la session utilisateur.

Raspberrypi : mise-à-jour stretch-buster

Voici un petit memo pour réaliser la mise-à-jour d’un raspberrypi tournant sous Raspbian stretch vers Raspbian buster.

Tout d’abord, il faut savoir que le téléchargement des paquets nécessaires à la mise-à-jour ne peut se faire que si la place nécessaire pour les stocker est disponible. Pour un système complet, il faut prévoir 8Go. Ainsi, vérifiez avec la commande :

df -h

que celle-ci est bien disponible. Cette commande signifie « disk free -human », soit en français « quelle est la place libre sur le disque, dans un langage humain ». Vous verrez alors apparaître une colonne vous donnant la mémoire disponible directement en Go.

Il faut ensuite réaliser un audit des paquet permettant de savoir si ceux-ci sont dans un état correct pour la mise-à-jour :

sudo dpkg --audit

Puis, il faut voir si des paquet sont bloqués :

sudo dpkg --get-selections | grep hold

L’argument de dpkg permet de récupérer la liste des paquets installés dont on recherche avec grep le motif « hold ». Ce motif signifie que l’utilisateur ne veut pas modifier (mettre-à-jour) le paquet. Comme cela peut poser problème, il faut qu’aucun paquet ne soit dans cet état à moins d’une bonne raison.

Il faut ensuite mettre à jour le système à partir duquel on va faire la mise-à-jour :

sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade

La première commande fait une mise-à-jour de la liste des paquets. La seconde mets à jour les paquets non vitaux et la troisième fait la mise-à-jour des paquets vitaux.

Il faut ensuite changer le nom des dépôts pour passer les faire pointer vers la nouvelle distribution Buster :

sudo sed -i /deb/s/stretch/buster/g /etc/apt/sources.list
sudo sed -i /deb/s/stretch/buster/g /etc/apt/sources.list.d/*.list

Ce deux lignes sont complexes. L’idée est de changer toutes les ocurences « strech » en « buster » dans plusieurs fichiers. Comme avec Debian, le fichier « source.list » du répertoire /etc/apt/ est touché. Mais en plus tous les fichiers .list du répertoire /etc/apt/source.list.d/, ce qui est propre à Raspbian.

L’utilitaire permettant ces modifications automatiquement est sed. Dans le cas présent, on utilise -i pour spécifier qu’on va écraser le fichier original. Puis, on spécifie que toutes les lignes (/g) commençant par deb se verront substituer (s) le motif stretch par buster.

Cela fait, on met à jour la liste des paquets de buster :

sudo apt-get update

Puis, on met à jour la distribution :

sudo apt-get upgrade
sudo apt-get dist-upgrade

Des questions vous seront posées auxquelles il faudra répondre Y dans la plupart des cas, à moins de savoir ce que vous faites.

Reste à effacer les paquets qui ne sont plus nécessaires :

sudo apt autoremove -y
sudo apt autoclean

Normalement tout devrait bien se passer. Mais, il arrive que ce ne soit pas le cas. Lisez bien alors les messages d’erreurs, car parfois ils permettent de forcer l’installation de quelques paquets récalcitrants qui peuvent bloquer la mise-à-jour.

Raspberrypi : bureaux virtuels

Le monde linux connaît bien les bureaux virtuels. Sur Raspberrypi, ils ne sont pas actifs par défaut. Pour les activer, il faut avoir recours à l’interface graphique de gestion du bureau « Open Box Configuration Manager » ou « Obconf » de son petit nom, qui n’est pas présente par défaut dans le menu framboise. Pour la faire apparaître, il faut se rendre dans le préférences de ce menu pour y sélectionner « Main Menu Editor ». Ensuite, dans cet éditeur de menu, il faut sélectionner les « Préférences » est cocher l’item « Open Box Configuration Manager ». Celui-ci apparaît alors dans les préférences du menu framboise.

En s’y rendant, sous l’onglet Bureau, on peut choisir le nombre de bureaux virtuels désirés et éventuellement les nommer.

Pour pouvoir les utiliser, il faut ensuite mettre un widget dans la barre de menus permettant de sélectionner celui sur lequel on veut se trouver. Pour cela, il faut cliquer-droit sur la barre de menus et choisir « Ajouter / Enlever des éléments au tableau de bord ». Ensuite, sous l’onglet « Appliquettes du tableau de bord », il faut choisir à gauche « Ajouter » et ajouter « Gestionnaire de bureaux virtuels ». On peut ensuite, en remontant l’appliquette dans la liste, la déplacer dans le tableau de bord pour une utilisation facilitée.

Reste que la sélection du bureau virtuel doit se faire avec la souris, ce qui n’est pas très agréable. Sous Debian, par exemple, choisir des équivalents claviers pour se déplacer d’un bureau virtuel à l’autre est facilité par un interface graphique. Sous Raspberry, il va falloir passer par l’édition d’un fichier de configuration d’Open Box. Il s’agit de :

~/.config/openbox/lxde-pi-rc.xml

Si ce fichier n’est pas présent, il faut créer dans le répertoire « .config » le répertoire « openbox » et y placer une copie du fichier :

/etc/xdg/openbox/lxde-pi-rc.xml

Ne travaillez pas directement dans le fichier sous etc, car il peut être mis-à-jour. Rendez-vous donc dans celui sous « .config ». Ce fichier contient énormément de choses. Notamment la liste des équivalents claviers. Cherchez-y donc la première ligne du code qui suit :

  <keyboard>
    <chainQuitKey>C-g</chainQuitKey>
    <!-- Keybindings for desktop switching -->
    <keybind key="C-A-Left">
      <action name="GoToDesktop"><to>previous</to><wrap>no</wrap></action>
 <!-- <action name="UnmaximizeFull"/>
      <action name="MaximizeVert"/>
      <action name="MoveResizeTo">
        <width>50%</width>
      </action>
      <action name="MoveToEdge">
        <direction>west</direction>
	    </action> -->
    </keybind>
    <keybind key="C-A-Right">
      <action name="GoToDesktop"><to>next</to><wrap>no</wrap></action>
<!--  <action name="UnmaximizeFull"/>
      <action name="MaximizeVert"/>
      <action name="MoveResizeTo">
        <width>50%</width>
      </action>
      <action name="MoveToEdge">
        <direction>east</direction>
            </action> -->
    </keybind>

Comme vous pouvez le voir, il s’agit de la partie consacrée au clavier. Oubliez les trois premières lignes. La quatrième définit l’équivalent clavier Ctrl-Alt-Left, c’est-à-dire ce qui va se passer quant on va presser simultanément sur Ctrl, Alt et la flèche gauche. En commentaire (<!– … –>) se trouve que que vous pouvez effacer, soit les actions prédéfinies pour cet équivalent clavier. À la place mettez la ligne :

<action name="GoToDesktop"><to>previous</to><wrap>no</wrap></action>

qui définit l’action du changement de bureau virtuel. Pour la flèche gauche, il s’agit de revenir sur le bureau précédent. C’est pourquoi l’action est « previous » et quelques lignes plus bas pour la flèche droite, l’action est « next ». Ainsi, au final, vous devriez avoir :

  <keyboard>
    <chainQuitKey>C-g</chainQuitKey>
    <!-- Keybindings for desktop switching -->
    <keybind key="C-A-Left">
      <action name="GoToDesktop"><to>previous</to><wrap>no</wrap</action>
    </keybind>
    <keybind key="C-A-Right">
      <action name="GoToDesktop"><to>next</to><wrap>no</wrap></action>
    </keybind>

En enregistrant ces modifications, vous pourrez alors changer de bureau directement au clavier, ce qui est très pratique.