Lotharedon

Journal d'un apprenti-sorcier en Sciences Informatiques

SailfishOS : impossible d'installer ou désinsaller un programme malgré de la place restante sur le mobile

Date 09/01/2016

SailFishOS est un OS de smartphone jeune et intéressant. Il est basé sur OpenSuse, Wayland, et son système de partitionnement est BTRFS. Cependant, parfois illui arrive d'avoir des bugs incompréhensibles. L'un d'entre se caractérise par l'impossibilité d'utiliser le store et de voir échouer les opérations exécutés par Warehouse avec un message disant "dismiss by user". La cause de tout ceci peut être un bug de BTRFS qui réparti mal les données etfait croire au système qu'il n'y a plus de place. Nous allons voir ici deux façon de le résoudre, et une façon simple de lesurveiller.

Solution #1 : avec le mode développeur

La première façon de réparer SailFishOS s'adresse aux gens ayant installé le mode développeur. Si ce n'est pas votre cas, passez à la section suivante ; avec ce bug, vous ne pouvez pas l'installer. Si vous y arrivez, c'est que vous n'êtes pas concerné par le contenu de cet article.
Grâce au mode dévelopeur, nous pouvons accéder au super utilisateur soit directement dans l'appli Terminal, soit via SSH. Choisissez votre façon de vous y connecter, et une fois cela fait, tapez dans le terminal (en root) :
btrfs fi show
. Elle devrait vous afficher quelque chose du type :
Label: 'sailfish'  uuid: 4b9a7c4f-83c2-49be-b2b7-6fe67cc12eae
        Total devices 1 FS bytes used 9.74GiB
        devid    1 size 13.75GiB used 13.31GiB path /dev/mmcblk0p28

Btrfs v3.16
Observez le dernier nombre indiqué : si il est proche de 13.75GB, alors vous avez un problème de répartition de données avec BTRFS (bug connu). Ici nous avons "13.31GB", nous sommes donc concerné par ce problème.
Une autre façon de le vérifier est d'utiliser la commande
btrfs-balancer allocation
. Si la valeur retournée est supérieur ou égal à "13153337344" octets, c'est la cause de notre problème.
Pour le régler, il faut utiliser la commande
btrfs-balancer balance
. Cependant il faut le faire en ayant la batterie bien chargé, voir en charge, et être patient, car cette commande peut avoir besoin de plusieurs heures pour s'exécuter.
Cependant il est aussi possible delancer la même opération via une commande un peu différente qui permet de la segmenter en opérations plus courtes :
btrfs balance start -dusage=XX /
. Le paramètre dusage spécifie le pourcentage maximal de block occupées par els données à relocaliser. En gros, plus la valeur est basse, plus les fichiers à relocaliser seront forcéments petits, donc moins il y en aura, et plus rapide de sera à exécuter. Ainsi, on pourra exécuter en plusieurs fois :
btrfs balance start -dusage=0 /
btrfs balance start -dusage=5 /
btrfs balance start -dusage=10 /
btrfs balance start -dusage=25 /
btrfs balance start -dusage=40 /
Avec ces commandes on va commencer par relocaliser les fichiers de très petites tailles, puis utilisant moins de 5 % des blocks, etc, jusqu'à relocaliser les fichiers utilisant jusqu'à 40% des blocks. Cette façon de faire permet également de traiter plus rapidement les grosses partitions formatées en BTRFS.


Solution #2 : sans le mode développeur.

Cette solution est basiquement la même que la précédente, mais contourne l'absence du mode développeur. Pour cela, nous allons utiliser le mode Recovery du Jolla.

  1. Éteindre le smartphone
  2. Démarrer leJolla en maintenant enfoncé les touche "Power" et "Volume -"
  3. Connectez le Jolla en USB à l'ordinateur
  4. Préparez votre ordinateur à la connexion :
  • Si vous êtes sous GNU/Linux, activez la nouvelle interface (avec ifconfig)
  • Si vous êtes sous Windows, installez telnet et le pilote de RNDIS
  1. Connectez vous en telnet à l'adresse 10.42.66.66. De la, vous avez accès au recovery
  2. Le recovery vous propose plusieurs choix. Exécutez le shell (choix n°4)

Nous voilà a présent dans le terminal de récupération du Jolla. Nous allons à présent préparer l'environnement de récupération :
  1. Créez un dossier /mnt/chroot (mkdir /mnt/chroot)
  2. Montez les partitions du Jolla de tel façon à pouvopir y lancer un chroot :
mount /dev/mmcblk0p28 /mnt/chroot
mount -o bind /proc /mnt/rootfs/proc
mount -o bind /dev /mnt/rootfs/dev
mount -o bind /sys /mnt/rootfs/sys
  1. Rentrez dans le chroot :
    chroot /mnt/chroot
    . Une fois dedans, on peut monter le homedir avec la commande "mount -t btrfs -o subvol=@home /dev/mmcblk0p28 /home".

À présent, nous sommes dans l'environnement de SailFishOS, nous pouvons traiter notre problème. Tou d'abord, vérifions qu'on soit bien concerné par celui-ci avec les commandes
btrfs fi show
et
btrfs-balancer allocation
. Si il n'y a pratiquement pas de place disponible ou pour la seconde commande si la valeur retournée est supérieure ou égale à "13153337344" octets, malgré la présence de beaucoup de place libre sur la partition (visible via la commande df -h), alors il faut rééquilibrer la répartition de l'écriture des données via la commande
btrfs balance start -dusage=XX /
, comme indiqué dans la section précédente.


Surveiller ce bug

Pour éviter de se retrouver à nouveau au dépourvu dans cette situation, une application est disponible dans OpenRepos (accessible via Warehouse). Elle s'appelle "btrfs balance checker". Elle enverra une notification lorsqu'on se rapproche de l'état paralysant le système.

Tags Tags de l'article :

Aucun commentaire

Comment RSS feed Flux RSS des commentaires de cet article