Installer NixOS sur une tablette Asus T100TA

Publié dans : Blog

Je dispose d’une honorable tablette Asus T100TA que j’utilise depuis deux ans maintenant comme tableau de bord pour ma domotique via Home Assistant. C’est simplement un navigateur (en substance, qutebrowser) en mode kiosk, qui tournait jusqu’à présent sous debian. Le remplacement par NixOS fait partie de mon plan pour divorcer de debian, mais certaines spécificités de la tablette rendent la tâche plus complexe que ce qu’il faudrait.

Principalement, son EFI est en 32bits alors que le système tourne en 64bits. Je me suis naïvement dit que, qu’à cela ne tienne, j’installe un système 100% 32bits. Sauf que ce faisant, NixOS ne fournit pas de paquets pré-compilés 32bits. Obligé, donc, de faire des manips, mais franchement, je ne regrette pas.

À moins que compiler l’ensemble des paquets ne vous fasse pas peur, si vous maitrisez assez NixOS pour faire du cross-compiling, ce qui n’est pas - encore - mon cas.

Téléchargements

Il faut commencer par télécharger les versions 32bits et 64bits de NixOS :

Système 32bits

Flashez l’ISO 32bits sur une clé USB, et démarrez-la. Procédez à l’installation du système comme indiqué dans la documentation officielle, en n’oubliant pas d’activer wpa_supplicant. Arrêtez-vous à la modification du fichier configuration.nix.

Par défaut, NixOS utilise systemd-boot à la place de grub, ce qui nous empêche de modifier la commande de démarrage. Il faut modifier le fichier configuration.nix pour pouvoir utiliser grub. En outre, cette installation n’est que temporaire, on ne va donc pas modifier les variables EFI pour le moment.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
boot.loader = {
  systemd-boot.enable = false;
  efi = {
    canTouchEfiVariables = false;
  };
  grub = {
    enable = true;
    efiSupport = true;
    efiInstallAsRemovable = true;
    device = "nodev";
  };
};

Enregistrez puis continuez l’installation en suivant à nouveau la documentation officielle. Après un redémarrage, vous devez disposer d’un système 32bits minimal mais fonctionnel. Ne modifiez encore rien dans votre configuration, tout va être remplacé sous peu (pas besoin non plus d’installer quoi que ce soit).

Si tout fonctionne bien (si vous avez pu démarrer et aller jusqu’au prompt), il est temps de passer au système 64bits.

Système 64bits

Flashez ensuite la clé USB avec l’ISO 64bits, mais ne démarrez pas dessus : il faut démarrer le grub qu’on vient d’installer en 32bits. La clé USB doit toutefois être branchée quand vous démarrez. Une fois sur l’écran de grub, appuyez sur la touche c pour entrer dans le shell de grub.

Lancez la commande suivante :

cat (hd0)/isolinux/isolinux.cfg

Vous verrez alors les options de démarrage disponibles. Ce qui nous intéresse, c’est la partie suivante :

init=/nix/store/qf8blw6g07xi9248m83ngn6h1rfwkn69-nixos-system-asus-t100ta-21.05.4114.195d5816cdd/init

À recopier dans une nouvelle commande à lancer :

linux (hd0)/boot/bzImage init=/nix/store/qf8blw6g07xi9248m83ngn6h1rfwkn69-nixos-system-asus-t100ta-21.05.4114.195d5816cdd/init intel_idle.max_cstate=1

Vous ne pouvez pas recopier telle quelle cette commande : vous devez l’ajuster en fonction de la sortie de cat (hd0)/isolinux/isolinux.cfg. Le chemin d'init peut changer. Par contre, vous pouvez/devez rajouter intel_idle.max_cstate=1 à la fin de la ligne : cela désactivera la mise en veille du CPU quand il idle, et évitera certain freezes connus sur cette plateforme.

Charger ensuite l’initrd :

initrd (hd0)/boot/initrd

Et démarrer :

boot

Vous devriez alors pouvoir démarrer sur la version 64bits de NixOS depuis votre clé USB. Reste encore à procéder à l’installation : là encore suivez la procédure officielle jusqu’à la modification du fichier configuration.nix, où l’on va préciser qu’on veut forcer le mode 32bits du bootloader :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
boot.loader = {
  systemd-boot.enable = false;
  efi.canTouchEfiVariables = false;

  grub = {
    enable = true;
    efiSupport = true;
    efiInstallAsRemovable = true;
    device = "nodev";
    forcei686 = true;
  };
};

On peut enfin terminer l’installation et redémarrer sans clé USB.

Problèmes

Les dernières mises à jour de debian me permettaient de régler le rétro-éclairage de l’écran via sysfs (dans /sys/class/backlight/). Malheureusement, je n’ai pas encore trouvé comment procéder sous NixOS. J’ignore s’il me manque un module noyau. J’ai essayé quelques trucs, sans succès pour le moment.

Autre soucis déjà rencontré sous debian : le module réseau pour le wifi provoque quotidiennement la déconnexion de la tablette, sans que quoique ce soit puisse y remédier, à l’exception d’un reboot complet. Ce n’est pas un problème spécifique à NixOS, c’est le module noyau brcmcfm qui semble incriminé, et il y a peu de chances que ce problème soit corrigé un jour…

Mis à part ça, le système tourne très bien, bien mieux que sous debian. La charge CPU est inférieure à 1, quand elle pouvait atteindre 2 voire 3 dans les mêmes conditions.

Conclusion

Pas simple. Pas à cause de NixOS, mais à cause d’Asus, intel, broadcom, et Microsoft évidemment (la tablette était livrée avec Windows 8). Mais j’ai la certitude, maintenant que le système est installé, qu’il ne bougera plus, à moins que je bidouille (et il y a des chances que je le fasse, ne serait-ce que pour le rétro-éclairage que j’aimerais vraiment corriger). Je la remplacerai sans doute pour une tablette plus adaptée à GNU-Linux (pour ne plus avoir les problèmes avec le module wifi), mais pour l’instant, elle me convient bien, et encore plus depuis que je l’ai passés sous NixOS. Un pas de plus vers le divorce complet de debian…