URL: https://linuxfr.org/forums/astucesdivers/posts/pot-pourri-astuces-pour-accelerer-le-demarrage-de-linux-1s-d Title: Pot-pourri : astuces pour accélérer le démarrage de Linux ~1s :D Authors: .Nicolas. Date: 2017年09月02日T16:52:26+02:00 License: CC By-SA Tags: Score: 4 Ceci ne se veut pas un tutoriel mais une liste d’idées plus ou moins expérimentales pour atteindre des temps de démarrage de l’ordre de la seconde (hors bios/uefi) pour un ordinateur mono-utilisateur. Pour utilisateur expérimenté. 0/ Le minimalisme : pas d’environnement de bureau, système "léger" 1/ ne pas faire de partition séparée (notamment /home) 2/ Le parallélisme : je passe par systemd. Le démarrage fainéant : activation par socket des serveurs réseaux, ajout de l’option x-systemd.automount dans le fstab pour tout ce qui est hdd (le disque principal est évidemment ssd). 3/ Il y a toute une série d’optimisation envisageables avec systemd qui est par défaut très mal fichu du point de vue du temps de démarrage (sa "rapidité" est un effet de bord non recherché). Malheureusement Systemd a conservé une partie de la philosophie de ces prédescesseurs : nous avons des étapes qui agissent comme butoir durant le processus de démarrage. 3.a/ Par exemple Xorg est lent à démarrer : plus d’une seconde, Wayland est bien meilleur mais je le trouve encore trop peu fiable. Exemple d’unité Xorg :> [Unit] Description=Xorg DefaultDependencies=false Conflicts=shutdown.target Before=shutdown.target [Service] Type=simple ExecStart=/usr/bin/Xorg -nolisten tcp :0 -quiet -gamma 0.8 -logverbose 1 L’unité est démarrée le plus tôt possible (et pas après une première phase d’initialisation). De fait c’est Xorg qui va être le plus bloquant durant le processus du démarrage (compter 1s environ + noyau ~0.5s). Pour réellement passer à 1s il faut utiliser Wayland (dans mon cas : iGPU intel driver modeset) et c’est alors clavier+souris USB qui sont les plus long à "donner la main". 3.b/ masquer dbus.service dbus.socket et systemd-logind.service, désactiver aussi tous les getty@ 3.c/ On ne peut alors plus se "logguer" ainsi (prévoir une clef usb de secours au cas où...), il faut ouvrir sa "session" via systemd. Par exemple, avec i3 :> [Unit] Description=i3 DefaultDependencies=false Requires=Xorg.service After=Xorg.service Conflicts=rescue.service shutdown.target Before=rescue.service shutdown.target [Service] Type=simple WorkingDirectory=/home/gaudin Environment=HOME=/home/gaudin SHELL=/bin/zsh DISPLAY=:0 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/gaudin/bin ExecStart=/usr/bin/i3 User=gaudin RestartSec=20ms Restart=on-failure [Install] WantedBy=multi-user.target Évidemment aucun exec ne doit se trouver dans le ~/.i3/config : préférer à cela un service systemd dédié autant que possible (je pense à Urxvtd entre autres). 4/ Compiler son propre noyau linux 4.a/ désactiver tout ce qui ne sert pas, désactiver les modules (mettre en dur le nécessaire). 4.b/ activer le CPU hotplug dans le menuconfig du noyau => c’est extrêmement long de démarrer les cœurs d’un CPU ! Le noyau doit démarrer avec l’argument `maxcpus=1` puis les CPUs seront démarrés via des unités `CPU@.service` :> [Unit] Description=CPU %i DefaultDependencies=false [Service] Type=oneshot ExecStart=/bin/dash -c 'echo 1> /sys/devices/system/cpu/cpu%I/online' [Install] WantedBy=multi-user.target 5/ Avec uefi, utiliser le lanceur de la carte mère (noyau compatible efi dans efi/boot/bootx64.efi d’une 1ère partition en fat32) 6/ nettement plus couillu. Lors de l’analyse des log noyaux au tout début du démarrage j’ai remarqué une série de lignes du style : `raid6: %-8s gen() %5ld MB/s\n"` Tout ceci pour tester la rapidité d’algorithmes et sélectionner le meilleur : qu’à cela ne tienne ! pas besoin de refaire le test à chaque fois. On modifie directement le source :> static inline const struct raid6_calls *raid6_choose_gen_alt( void *(*const dptrs)[(65536/PAGE_SIZE)+2], const int disks) { const struct raid6_calls *best; best = raid6_algos[5]; pr_info("raid6: using algorithm %s", best->name); raid6_call = *best; return best; } En adaptant le `[5]` à votre cas (voir dans le source le contenu, en dur, du tableau). On remplace l’appel à la fonction originale par notre alternative, on redémarre et vérifie que l’algo retenu est le même que celui sélectionné avec le test. Tout ceci se trouve dans le fichier lib/raid6/algos.c 7/ pester contre l’assembleur de la carte mère, qui lui n’a rien optimisé du tout (5s dans le meilleur des cas \o/)