Journal Notes de migration vers l'architecture 64 bits de Debian sur un Raspberry Pi 3B

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes :
22
13
juil.
2023

Sommaire

Voici quelques notes prises à l’occasion de la migration d’une Raspbian 32 bits au même système, mais en 64 bits.

La petite machine

Il s’agit d’un Raspberry Pi 3B (rev 1.2) de 2015 qui joue depuis près de 8 ans fidèlement le rôle de serveur :

  • partage local SMB ;
  • hébergement du site Wordpress de l’artiste Lucy Nuzit. Allez-y, ça vaut le détour (je suis parfaitement objectif). À ce propos, si vous avez des commandes à lui passer pour votre association, institution, éditeur, ou une proposition d’exposition, n’hésitez pas à la contacter ;
  • hébergement d’un site destiné aux élèves du secondaire qui préparent les épreuves anticipées de français du baccalauréat ;
  • une instance freshrss, indispensable pour la veille ;
  • une instance Nextcloud.

La carte est vissée dans un boîtier avec un disque dur de 1 To connecté en USB qui permet aussi l’amorçage du système : il n’y a plus de carte SD depuis belle lurette. Le disque dur est bien moins cher au Go, et surtout bien plus fiable vu la quantité d’écriture sur le système.

Le tout est gentiment propulsé par Raspberry Pi OS, de mise à niveau en mise à niveau, jusqu’à aujourd’hui une base Debian 11 (Bookworm est sortie, mais pas sa déclinaison de chez Raspberry à ce stade).

Le problème

Tout fonctionnait à peu près correctement. Les ennuis viennent essentiellement de Nextcloud.

Nextcloud fonctionne plutôt bien sur ce matériel. Les 1024 Mo de RAM ne sont pas un problème quand l’instance compte seulement 3 utilisateur·ices. De version en version, les exigences techniques pour maintenir un niveau de réactivité efficace au quotidien se sont faites plus pressantes. Il a fallu modifier les schémas de la base Mariadb, gérer sa montée en version ainsi que celle de PHP, configurer PHP, mettre en place le cache, déployer une base Redis en plus. Dans l’ensemble, le système fonctionne très bien, au point qu’il est depuis plusieurs années utilisé en permanence pour nos besoins professionnels.

Pour donner une idée sudo -u www-data du -h /var/www/nextcloud → 31G.

Mais ces derniers mois, je me suis heurté à un mur : le support de l’architecture armhf, historique du Pi depuis ses débuts, a commencé à sérieusement battre de l’aile. Une mise à niveau s’est d’abord très mal passée parce que certaines variables dans le code étaient écrites avec uniquement un OS 64 bits en tête. Le bug est apparu, a été corrigé, puis est réapparu, et finalement l’annonce est tombée : fin du support 32 bits.

Utiliser une instance Nextcloud sans mises à jour de sécurité à la fin du support n’a rien de réjouissant, surtout quand on utilise le système au quotidien.

Les RPI 3B ont un processeur 64 bits. Sur le principe tout était donc possible, mais les quelques pages consacrées aux tentatives de crossgrade faisaient surtout le récit d’échecs lamentables ou de considérations de haute volée expliquant que c’est trop compliqué.

Une seule solution rapide, donc : repartir sur une base propre.

Réinstallation d’un OS 64 bits et restauration

La sauvegarde

Pour la sauvegarde, ce n’était pas très compliqué. J’avais déjà un script très court qui procède à une sauvegarde, avec un cron qui l’exécute chaque nuit.

#!/bin/bash

cd /
mysqldump --all-databases -uroot -pXXXXXXXXXX --default-character-set=utf8mb4 | zstd - > /backup/dump.zst
mysqldump -uwordpress -pYYYYYYYY wordpress_db | zstd - > /backup/wordpress_db.zst # au cas où

dpkg --get-selections > /backup/packages.txt

rsync -e "ssh -i /zzzzz/id_ed25519" -axvz --delete --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found","/var/swap"}  /   user@user.rsync.net:/data1/home/user/backup

Simple et rustique, mais très efficace, justement pour cette raison (par ailleurs, j’ai confiance en la plateforme qui héberge les données, sinon il faut chiffrer.)

Pour assurer ses arrières, il suffit d’une adaptation du script et de faire la même chose avec un disque dur externe.

Prendre un snapshot avec dd n’avait pas grand intérêt : déjà parce que ça aurait été très long, ensuite parce que de toute façon les données étant sauvegardées, par question de revenir en arrière.

La réinstallation

On se lance. Le début n’est pas très compliqué : l’outil mis à disposition a l’avantage sur dd de préconfigurer certains éléments : l’utilisateur, ssh, etc. L’importation des clés SSH n’a pas bien marché, mais par précaution j’avais configuré la connexion par mot de passe pour éviter les ennuis de cette nature.

Les premières choses à faire

Une fois que le système a redémarré une ou deux fois, et est branché en ethernet, il suffit de se connecter en SSH. Évidemment comme on se connecte d’ordinaire avec une clé, là il faut penser à utiliser une commande différente :

ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no user@domain

La première chose à faire, c’est d’installer tmux. La deuxième, c’est de restaurer les clés publiques pour accéder au serveur, puis les clés privées du serveur pour accéder aux sauvegardes distantes.

Les fichiers de config

Une fois que c’est fait, il suffit d’un mv /etc/ssh /etc/ssh.bak && rsync -a user@user.rsync.net:/data1/home/user/backup/etc/ssh /etc && systemctl restart ssh

Si ça ne fonctionne pas, on a toujours la connexion ouverte dans le premier shell, à ne surtout pas fermer tant qu’on n’est pas certain d’arriver à se connecter avec la clé.

À partir du moment où ça fonctionne, ce n’est plus très compliqué. Dans /etc, il suffit de répéter l’opération qu’on a fait pour SSH et récupérer les éléments importants, comme :

  • letsencrypt
  • apache2
  • php
  • mysql
  • fail2ban

et quelques autres. Pourquoi pas tout /etc ? Parce qu’après 8 ans de mises à niveaux et de configurations modifiées, il m’a semblé utile de repartir sur des bases saines.

Récupérer les données

Même opération, avec une subtilité.

rsync -a user@user.rsync.net:/data1/home/user/backup/var/www /var

Sous Debian, les paquets créent un utilisateur www-data pour apache, qui a évidemment un accès limité au système. En gros, tout ce qui est dans /var/www lui appartient. Or le userid de mon ancien utilisateur www-data ne correspondait pas au nouveau, puisque d’autres utilisateurs avaient été créés. Un coup de sudo chown -R www-data:www-data /var/www/* règle l’affaire.

Réinstaller les paquets

Là on arrive à la magie des gestionnaires de paquets. Vous vous rappelez que le script sauvegardait à la fois tous les fichiers, mais aussi une liste des paquets installés :

dpkg --get-selections > /backup/packages.txt

En l’ouvrant, je me suis rendu compte que je n’avais pas anticipé un certain nombre d’occurrences de l’architecture : armhf. Qu’à cela ne tienne, un coup de sed -e 's/armhf/aarch64/' sur le fichier, et on est prêt·e à le donner en entrée au gestionnaire de paquets :

apt update
apt-cache dumpavail | dpkg --merge-avail
dpkg --set-selections < newpackages.txt
apt-get dselect-upgrade

Le gestionnaire de paquets avertit que certains vieux machins ne sont pas disponibles pas, mais ce n’est sans doute pas trop grave, il doit s'agir de résidus d'installations précédentes. En tout cas, ça n'a pas l'air bloquant. Hop ! On saute le pas. Il faut faire attention une fois que les paquets ont été téléchargés et que l’installation à proprement parler commence, à toujours exiger que la version du mainteneur n’écrase pas notre belle config qui marche. Le plan se déroulait à la perfection, chaque petite ligne permettait d'écraser une larme de satisfaction, au bout de 20 min…

La machine fige. Panique à bord. Après avoir espéré une demi-douzaine de minutes, de guerre lasse, il faut redémarrer. Et sur un pi, redémarrer, c'est débrancher la prise, littéralement, ce qui inspire toujours une confiance très relative. Au bout d’une minute après avoir rebranché, la connexion en SSH répond, le système semble stable… bon. Il faut finir la configuration des paquets par un dpkg –configure -a qui s’achève sans autre incident.

Restaurer la base de données

Restaurer mariadb, en fait, c’est tout simple. Mon script de sauvegarde exportait toute la base :

mysqldump --all-databases -uroot -pXXXXXXXXXX --default-character-set=utf8mb4 | zstd - > /backup/dump.zst

Avec précaution, il suffit de restaurer :

unzstd dump.zst
mysql -u root < dump

Le mot de la fin

Au redémarrage, tout fonctionne. Nextcloud, FreshRSS, Wordpress… tout roule, sans noter ni amélioration, ni dégradation des performances : de toute façon, avec 1Go de RAM et un disque dur en USB, il ne faut pas s’attendre à des changements extraordinaires. La mise à niveau de Nextcloud se déroule sans accroc. Mais bientôt, il faudra passer à Bookworm, puisque Nextcloud ne supporte plus php-7.4…

En tout état de cause, ce type de procédure est relativement facile à mettre en œuvre pour une solution auto-hébergée.

  • # Et pourquoi pas à chaud ?

    Posté par  . Évalué à 4.

    J'ai déjà par le passé fait une mise à jour à chaud, sans réinstallation, d'une Debian i386 vers amd64…
    Alors pourquoi ne pas l'avoir fait comme ça ? :)

    Grosso modo,

    dpkg --add-architecture aarch64
    apt update
    apt install logicielx:aarch64
    

    (Bon faut commencer par le noyau évidemment)

    • [^] # Re: Et pourquoi pas à chaud ?

      Posté par  (site web personnel) . Évalué à 3.

      Je me suis posé la question, c'est pour ça que j'ai mentionné que j'ai cherché des résultats sur le crossgrading dans le journal.

      Mais en général, c'était un échec, ou plus compliqué qu'il n'y paraissait.

      D'abord, chez Debian, ça peut effectivement se résumer à quelques commandes, mais si on veut assurer le coup c'est loin d'être aussi simple. Systemd notamment peut faire des siennes.

      Par ailleurs, la distribution de raspberry pi diffère légèrement, et ces différences (notamment au niveau du kernel, des dépôts, de certains paquets installés, etc.) peuvent conduire à l'échec de l'opération. Et puis, en vérité, si Debian garantit que le multiarch et le crossgrading sont possibles, c'est avant tout sur le couple i386/amd64.

      J'avais lu il y a quelques mois que la fondation RPI indiquait ne pas du tout supporter la transition. Comme des sauvegardes étaient à disposition et que je ne dispose pas d'un temps infini pour corriger mes propres (inévitables) erreurs, je n'ai pas cherché à réaliser d'exploit. Mais quelqu'un de plus compétent·e que moi aurait sans doute trouvé la chose réalisable !

      • [^] # Re: Et pourquoi pas à chaud ?

        Posté par  . Évalué à 2.

        Après tu as choisi de tout passer en 64 bits… Ce n'était pas la seule option, tu pouvais passer le noyau en 64 bits (option supportée par raspbian) et ne migrer en aarch64 que ce qui t'importait (vu ton article, je dirais PHP uniquement)…

  • # Question bête

    Posté par  (site web personnel) . Évalué à 2.

    As tu pensé à passer le tout sous Docker ? Pour moi, Nextcloud et Wordpress sont quand même très compliqués à mettre à jour, c'est pourquoi j'aurais tenté de passer cela sur Docker.
    Par contre, je ne sais pas ce que cela donne au niveau de la mémoire…

    • [^] # Re: Question bête

      Posté par  (site web personnel) . Évalué à 2.

      C'est le contraire d'une question bête, et c'est même la direction générale que devrait prendre l'installation à l'avenir : plus facile à sauvegarder, restaurer…

      Mais la question ne s'est guère posée avant la migration, pour deux raisons :
      1. De toute façon, quand j'ai installé ces services, docker était trop neuf, et pas supporté en armhf, ce qui réglait la question. Aujourd'hui, il (semble que)[https://docs.docker.com/engine/install/debian/] le armhf soit supporté par docker, et podman le supporte.
      2. Nextcloud doit de toute façon être exécuté en 64 bit. Dans cette perspective, il faut que l'hôte soit forcément en 64 bits pour lancer des containers en 64 bits.

      Maintenant que c'est fait, la prochaine tâche après la migration à bookworm pour avoir un userland à jour sera de passer aux containers, sans doute avec podman. Je n'ai pas l'impression que la quantité de RAM consommée sera insoutenable. Mais il faudra que je me documente pour voir comment on peut configurer le tout avec des sous-domaines dans apache, et comment se passent les mises à niveau.

    • [^] # Commentaire supprimé

      Posté par  . Évalué à 4. Dernière modification le 13 juillet 2023 à 16:48.

      Ce commentaire a été supprimé par l’équipe de modération.

      • [^] # Re: Question bête

        Posté par  . Évalué à 5.

        Parce qu'en théorie, il suffit juste de récupérer la nouvelle version du conteneur et de redémarrer le conteneur sur cette version.

        Je dis en théorie parce que s'il y a un processus de migration propre à l'application (un schéma de base de données à mettre à jour par exemple), il faudra quand même la faire à la main, les conteneurs n'étant pas magiques non plus.

        Après ce processus peut être aussi intégré dans le conteneur ce qui fait qu'on a presque rien à faire manuellement au final. Dans tous les cas, il faut toujours continuer à lire les notes de mise à jour.

        • [^] # Re: Question bête

          Posté par  . Évalué à 4. Dernière modification le 13 juillet 2023 à 18:43.

          toutes les applications qui sont bien pensées et pas écrites avec les pieds, l'upgrade se résume, quand on pointe sur latest et qu'on utilise docker-compose, à :

          docker-compose pull
          docker-compose up -d
          docker-compose logs -ft
          

          alors, oui, ca permet de faciliter l'exploitation ; ces applications qu'on gère de cette facon sans aller trafiquer la base de données pour gérer manuellement l'upgrade des tables, ca devient le standard. Alors oui, docker facilite l'exploitation.

          dans la vrai vie, c'est un peu plus complexe :
          - on n'utilise pas latest, mais un vrai n° de TAG (version),
          - on fait du backup, voir des snapshots sur les serveurs de virtualisation
          - on teste sur une VM de kalif,
          - on planifie, on communique auprès des users,
          - on gère les évolutions dans un repos git avec des tickets et des tags,

          mais le plus gros de la MAJ, c'est tout de mêmes les 3 lignes ci-dessus et c'est très très facile à faire.

      • [^] # Re: Question bête

        Posté par  . Évalué à 0.

        l'un des tous premiers liens Bard : https://g.co/bard/share/42b01c97737b

      • [^] # Re: Question bête

        Posté par  . Évalué à 8.

        Faire la mise à jour de nextcloud, c'est vraiment compliqué. 3 lignes de commandes suffisent. Mais pour les petites instances, tu peux le faire avec l'interface web.

        Je ne suis pas sur que tu y gagnes avec docker.

        C'est bien beau de prôner la reprise de contrôle de nos données, mais si c'est pour donner le contrôle de nos mises à jour à une société, je ne vois pas trop le bénéfice.

  • # 32 bits toujours valable

    Posté par  . Évalué à 1.

    Bonjour,

    J'utilise un raspberry 4B en mode 32 bits.

    J'ai eu la même crainte (et problème) que toi il y a quelques mois (sur une distribution archlinux pour arm). J'avais alors décidé de bloquer les mises à jour de Nextcloud pour rester à la version 25.

    Puis, profitant de ce jour férié, je suis tombé sur un billet sur la page d'aide de Nextcloud

    Ce matin, j'ai fait le foufou (comprendre faire une mise à jour sans aucune certitude) et tout s'est bien passé.

    A priori, le support pour le 32 bits est à nouveau effectif.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.