Aaah cette µSD, tant de potentiel, si peu employée ! Il est possible de plugger une carte de 128GO dans le terminal et malgré tout se retrouver coincé dans les 16GO initiaux, seuls accessibles des applications ! Et pourtant, il y a moyen de s’affranchir, partiellement, de cette barrière. Mais il faut alors s’intéresser sérieusement à BTRFS !

 Du plus naïf au plus subtil

Sailfish1Naïf, si!si!

Le plus simple, déjà évoqué, reste le lien symbolique : vous copiez un répertoire vers la µsd et vous établissez un lien symbolique ; suffisant mais pas sans conséquences quand on déplace le répertoire « picture » ou « musique« , problématique quand c’est tout home que l’on souhaite migrer vers la µSD et ça ne marche plus quand c’est le répertoire d’alien DALVIK. Or c’est surtout la partie Android qui grossit : après here+ et quelques cartes, Waze, Navifree et encore d’autres cartes, Sony Motion Record, TV Orange, TV SFR, TV Free,  voila que la partie Android pèse déjà 7GO pour 14 maxi …

Un rien plus compliqué ?

On avait exploré le montage en bind qui contrairement à « ln » offrait la garantie de laisser l’arborescence initiale en l’état (utile quand on redémarre le terminal avec une autre carte µSD pas préparée), mais ça ne suffisait pas. Autant on pouvait faire ubiquiter cette carte µSD dans alien dalvik, autant on pouvait re-localiser les répertoires documents, musique, picture ou download sur la µSD, autant on ne pouvait toujours pas l’employer simplement comme une extension du disque.

En fait la difficulté venait de ce que l’on s’arrêtait à mi-chemin : celui de la rédemption passait par la lecture du manuel du filesystem (toujours en beta) Btrfs : et oui « Relis Ton Foutu Manuel, mec », encore et toujours ce RTFM lancinant, implacable, incontournable : Read The Fucking Manual ! man.rtfm2

Le Potentiel de BTRFS

Déjà il rend possible de formater tout le disque cible sans le partitionner. Quel intérêt ? De créer des sous-volumes afin d’éviter d’arbitrer la taille des partitions, arbitrages qui finissent toujours par une des partitions à moitié vide, alors que l’on manque de place sur l’autre, pleine raz la gueule. Situation qui est toujours  frustrante, tout comme il est souvent compliqué de redimensionner les 2 partitions à la volée.

Sous linux, les disques, internes comme externes, après détection par le kernel, se présentent sous la forme de pseudo-répértoires /dev/sda, /dev/sdb, /dev/sdc, etc, selon que l’on s’intéresse au premier (sda) disque, au second (sdb), au troisième (sdc), etc. Et partitionner un disque crée des espace bornés d’un certain nombre d’octets. Ces espaces se nommeront alors /dev/sda1 pour la première partition, /dev/sda2 … jusqu’à /dev/sda4 dans le monde FAT-MS/DOS … Pour contourner cette difficulté, une partition peut être déclarée comme secondaire, statut permettant de créer des partitions logiques : si on décide que la sda3 est secondaire, alors elle est renommée en sda5, et pourra se subdiviser en sda6, sda7, … , sda11, etc.

Sailfish2Les carte SD, utilisant des contrôleurs spécifiques, apparaissent en /dev/mmcblk1, pour la première insérée, /dev/mmcblk2 s’il existe un second slot et que c’est la deuxième. Et lors du partitionnement, elles se subdivisent en mmcblk1p1, mmcblk1p2, mmcblk1p5, mmcblk1p6 selon vos besoins. Ce sont ces partitions (sda6, mmcblk2p1, etc) qui seront formatées puis montées pour être accessible depuis votre ordinateur. Mais avec BTRFS, il est possible de formater directement tout le device (sda, mmcblk1, etc) , sans le partitionner, pour créer ensuite dans ce device des sous volumes (comme des répertoires) séparés (comme des partitions) qui seront les cibles des montages.

raspberrypi linux box

très petites linux box

Précisons aussi que cette étape sera plus aisée à réaliser sur votre linux-box, M$-Windows n’ayant pas les utilitaires nécessaires, et la version de BTRFS du Jolla pouvant être bridée. Mais quand on utilise un linux-phone aussi confidentiel Unlike, une linux-box n’est forcément pas loin de votre clavier.

linux-box-ps3-cluster

Une linux box : Cluster de PS3 sous Other OS linux PPC

Pour formater la µsd-card en Btrfs sans la partitionner, il suffit de le faire directement sur le device ciblé avec la commande mkfs.btrfs :

mkfs.btrfs -O ^extref -f /dev/mmcblk1
  • mkfs.btrfs : formate la carte (non partitionnée)
  • -Pour l’instant extref qui augmente le nombre d’inodes supporté doit être désactivée car cette fonction  est encore instable
  • -f pour écraser un file-systeme et partitionnement déjà présent
  • /dev/mmcblk1 : la carte µSD

Pour créer ces sous volumes Montons d’abord le device dans un répertoire de votre choix (/media/sdcard)

mkdir /media/sdcard
mount -o subvolid=0 /dev/mmcblk1 /media/sdcard

Puis créons les sous volumes : Jolla, android -création du sous-volume : Jolla

cd /media/sdcard
btrfs subvolume create Jolla

-création du sous-volume : android.

btrfs subvolume create android

Les sous volumes ont accès à la totalité de l’espace disque. Finis les partitions trop petites ou trop grandes, il ne restera qu’un disque plein ou pas encore plein. Sailfish3Nous devons récupérer des infos pour continuer les montages ; alors testons notre construction :

btrfs subvolume list .

– pour obtenir les ID de chaque sous-volume afin d’identifier Jolla pour induire son montage par défaut Définissons le subvolume par défaut :

btrfs subvolume set-default "ID-du-sous-volume-Jolla" /media/sdcard/

– définit jolla comme point de montage par défaut

chown -R 100000:100000 jolla

– pour affecter ce sous-volume à l’utilisateur nemo pour enfin démonter tout ça

cd
umount /media/sdcard
umount /media/sdcard

… et …

Retour de la carte µSD dans le JollaPhone,

Tout d’abord, précisons que le JollaPhone est en version 1.1.1.27. Dans le cas d’une révision différente, vous devrez imaginer les adaptations qui s’imposeront. Enfin, toutes les prochaines opérations se feront à vos risques périls, des applications installées inconnues de mon matériel pouvant bêtement interférer.

En installant physiquement la µSD dans le terminal Jolla. Magie de BTRFS, associée au script original sd-mount du jolla, la carte est immédiatement identifiée et montée dans son répertoire d’accueil, visible par un simple df -h /dev/mmcblk1

$ df -h | grep /dev/mmcblk1
/dev/mmcblk1 60G 21G 36G 37% /media/sdcard/a773af90-4417-4bc8-a7dc-47487815a909

Par contre un ls sur /media/sdcard/a773af90-4417-4bc8-a7dc-47487815a909 ne ramène rien : c’est le sous volume Jolla de la µSD, et qui reste accessible comme une carte SD ; le système Sailfish s’attend à une SD et il y a une SD, correctement placée et montée. Voila une source de problème évitée.

Passons aux espaces android :

La suite des opérations nécessite de passer root, Asus-Transformer-linux-root-185x130 Tout d’abord montons les sous volume android dans un répertoire temporaire :

$devel-su
Password:
mkdir -p /tmp/Android
mount -o subvol=android,compress,dirsync,noatime,users /dev/mmcblk1 /tmp/Android

il vous faut maintenant copier le répertoire android, utilisé par alien dalvik. Pour ce faire il est impératif d’arrêter le service android

systemctl stop aliendalvik.service

pour dupliquer son répertoire initial : /data/media

rsync -a /data/media/ /tmp/Android

Il est important d’écrire /data/media/ pour copier le contenu de /data/media dans /tmp/Android; si vous omettez le dernier « /« , vous dupliquerez sur la µSD, le contenu avec répertoire. Dés que toutes ces copies sont terminées, alors sauvegardons /media/data, on ne sait jamais :

 {
cd /data
mkdir -p /SD64/jollasave
tar zScvf /SD64/jollasave/alien-dalvik.tgz ./media
}

et mettons tout à sa place :

umount /tmp/Android
mount -o subvol=android,compress,dirsync,noatime,users /dev/mmcblk1 /data/media
systemctl start aliendalvik.service

Désormais alien dalvik s’exécute depuis la carte SD, d’où la nécessité d’en choisir une parmi ce qui se fait de plus rapide. Testez vos applis android, dont NOKIA HERE, l’appli trop délicate jusqu’à présent pour tourner sur la µSD par des moyens naïfs. Poussez les tests jusqu’à installer/désinstaller une nouvelle appli. Selon les performances de votre carte et vos exigences personnelles, soit vous trouverez cela génial/satisfaisant/supportable et la prochaine étape sera d’automatiser tout ça avant de faire du ménage, soit débile/insupportable/inutilisable et vous renoncerez en reformatant votre µSD, ce qui ne posera aucun soucis, rien n’ayant été ajouté ou supprimé sur votre Jolla.

Sailfish4Ayez à l’esprit que si vous souhaitez adopter cette nouvelle configuration, si vous décidez d’utiliser votre carte mémoire dans ces nouvelles conditions, il ne sera plus trop question de la considérer comme amovible; même si sous certaines conditions, ce ne sera pas impossible, ne négligez pas ce détail.

OK ça me plait!

Alors un petit peu de ménage :

le répertoire /media/data est pour l’instant la copie présente sur la µSD; Pour gagner de la place il va être nécessaire d’effacer l’instance présente dans la mémoire du Jolla : c’est à dire demonter /data/media puis effacer son contenu (opération irrémédiable)

$devel-su
systemctl stop aliendalvik.service
umount /data/media
rm -rf /data/media/*
ls -la /data/media

normalement le répertoire est vide, sauf s’il y avait des fichiers cachés (précédés par un « . ») … Si c’est le cas, effacez les aussi. Une fois le répertoire /media/data passé au karsher, remontez sa copie présente sur la carte µSD avant de relancer le service Alien-Dalvik :

mount -o subvol=android,compress,dirsync,noatime,users /dev/mmcblk1 /data/media
systemctl start aliendalvik.service

et retestez Android … Si tout fonctionne comme avant c’est presque fini, Si ça ne vous plaît plus, il vous reste votre copie de sauvegarde que vous pourrez toujours restaurer. sailfish1234

Mais à ce stade là, montage demontage, etc, tout est en commande manuelle. C’est sympa, mais au moindre redémarrage, il vous faut réouvrir un terminal, devenir root et retaper les commandes :

devel-su
systemctl stop aliendalvik.service
mount -o subvol=android,compress,dirsync,noatime,users /dev/mmcblk1 /data/media
systemctl start aliendalvik.service

Tout sauf pratique, même si on en fait un petit script. Il serait possible de s’inspirer de ce travail pour simplifier la tâche, mais même cela n’est guers satisfaisant : il faudrait que ces montages soient réalisés au démarrage … Il faut donc s’intéresser à la séquence de boot du Jolla et du système qui s’en charge : systemd.

Systemd

Je vous épargne l’explication exhaustive de « systemd » pour ne vous présenter que la partie qui nous intéresse :

lors du démarrage, systemd lance en parallèle un ensemble de services, décrits dans une série de fichiers répondant à une grammaire stricte. Mais si lancer en parallèle des services permet d’accélérer le démarrage,  il peut, parfois, être important de les astreindre à une chronologie précise. Dans le cas qui nous intéresse, il est important que la carte µSD soit d’abord détectée puis montée avant d’en monter ses subvolum, tout comme il est important que le service alien-dalvik ne soit  lancé qu’après le montage de son subvolum dédié … Tout cela est orchestré dans ces fichiers de services qui s’exécutent au démarrage. Il faut donc en rédiger un :

Monter le subvolum android au démarrage

Sur le Jolla, les services Systemd sont rangés dans /etc/systemd/system/ où nous allons créer un fichier  androidsdcard.service. En tant que root générez ce fichier de la sorte, par exemple

systemctl stop aliendalvik.service
touch /etc/systemd/system/androidsdcard.service
cat << !  >/etc/systemd/system/androidsdcard.service
[Unit]
 Description=Mount µSDCard btrfs subvolume pour Android et Nemo
 ConditionPathExists=/dev/mmcblk1
 ConditionPathIsDirectory=/data/media
 Requires=local-fs.target
 Before=aliendalvik.service
 After=local-fs.target mount-sd@mmcblk1.service
 BindsTo=mount-sd@mmcblk1.service
[Service]
 Type=oneshot
 RemainAfterExit=yes
 ExecStart=/bin/sh -c '/bin/mount -o subvol=android,compress,dirsync,noatime,users /dev/mmcblk1 /data/media'
 ExecStop=/bin/sh -c 'systemctl stop aliendalvik.service; /bin/umount /data/media'
[Install]
 WantedBy=local-fs.target aliendalvik.service
!

il vous faut maintenant enregistrer le service :

systemctl enable androidsdcard.service

avant de redémarrer … Vérifiez dans un terminal, juste après le reboot, que tout s’est bien passécapture-vi

[nemo@Jolla ~]$ df -h
Filesystem Size Used Avail Use% Mounted on
rootfs 14G 6.2G 6.9G 48% /
/dev/mmcblk0p28 14G 6.2G 6.9G 48% /
devtmpfs 405M 64K 405M 1% /dev
tmpfs 406M 416K 406M 1% /dev/shm
tmpfs 406M 30M 376M 8% /run
tmpfs 406M 0 406M 0% /sys/fs/cgroup
tmpfs 406M 28K 406M 1% /tmp
/dev/mmcblk0p19 7.9M 4.1M 3.9M 52% /drm
/dev/mmcblk0p18 64M 45M 20M 70% /firmware
/dev/mmcblk0p28 14G 6.2G 6.9G 48% /home
/dev/mmcblk0p25 7.9M 4.2M 3.8M 53% /persist
/dev/mmcblk0p9 48M 7.9M 40M 17% /var/systemlog
tmpfs 406M 0 406M 0% /mnt/asec
tmpfs 406M 0 406M 0% /mnt/obb
/dev/mmcblk1 60G 21G 36G 37% /media/sdcard/a773af90-4417-4bc8-a7dc-47487815a909
/dev/mmcblk1 60G 21G 36G 37% /data/media
/dev/fuse 60G 21G 36G 37% /home/nemo/android_storage
[nemo@Jolla ~]$

que voit-on ?

  • /dev/mmcblk1 est utilisé par /media/sdcard/a7735f90-4417-4bc8-a7dc-b74878154909, /data/media, /home/nemo/android_storage
  • qu’ils accèdent au même espace de stockage, pour une même volumétrie :  /dev/mmcblk1 60G 21G 36G 37%
  • que le repertoire de la µSD  /media/sdcard/a773af90-4417-4bc8-a7dc-47487815a909 est toujours là
  • que desormais /data/media est porté par /dev/mmcblk1
  • qui sont les cibles de /dev/fuse (qui pointe sur /data/media) qui est le repertoire actif /home/nemo/android_storage d’alien Dalvik
  • que /dev/mmcblk0p28est soulagé des 7GO qu’utilisait Android.

linux_for_dummiesLe plus dur est réalisé …

Ce n’est pas encore tout à fait la fin, mais à ce stade là, votre µSD supplèe le manque de mémoire du Jolla. Grace à sailfishOS, on rajoute même un peu de sécurisation en séparant les espaces d’écriture ;  on aurait très bien pu  juste créer ces répertoires dans une partition unique et les re-dispatcher/re-binder ensuite à partir du montage racine de la µSD  … Mais voila, à partir de cette racine il est possible d’intervenir (effacer, modifier, tracker, data-miner) dans tous les autres répertoires.

Or avec les sous volumes de BTRFS, tout comme avec des partitions, les différents volumes ne sont pas visibles les uns des autres : un effacement total du contenu de la carte SD (le sous volume Jolla) y reste cantonné. Si l’on a pas ouvert de « portails »  dans Android-storage  (le sous volume Android), tous Spywares/Malwares y resteront « enchristés », tous les data-mineurs ne descendront pas plus bas (enfin hélas pour l’instant ils peuvent avoir accès à / mais si Jolla durci la sécurité, notre script reste valide). Comme pour des répertoires dans une partition unique, la place accessible à chaque sous volume, n’est bornée que par la place disponible de la µSD ; et ça c’est bon pour le moral 😉 .

Et si vous êtes arrivé jusque là, vous méritez bien une petite récréation !

biblio : https://together.jolla.com/question/40802/how-to-format-your-usd-card-to-btrfs-and-share-space-with-android/ http://linuxfr.org/users/coren/journaux/creer-un-service-sous-systemd http://talk.maemo.org/showthread.php?t=92449 Forum_LINK Aujourd’hui la version 1.1.2.16 (la 12emme donc) vient d’être déployée : malgré une modification de l’organisation du répertoire /opt/alien, le script s’est parfaitement comporté : les MàJ sur Alien Dalvik ont bien été appliquées et le système fonctionne apparemment toujours depuis la µSD, sans mauvaise surprise.

bandix400

bandix400

Auteur

Je suis passionné de génétique, d’informatique, de mécanique, et je m’arrête là car je manque déjà de temps pour tout faire ; autrement j’y rajouterais volontiers l’électronique, la musique, l’aquariophilie, le graphisme, le jeu Vidéo (simulation de conduite/FPS) et du ju-jitsu traditionnel.
bandix400

Les derniers articles par bandix400 (tout voir)

Passer son N9 en Openmode
Raspberry Pi : Ajouter un écran de démarrage