Arch Linux sur MacBook Pro Retina 2014 avec DM-Crypt, LVM et hibernation
  2015-01-10

English version English version

Note: Cette version n’est plus à jour par rapport à la version anglaise. S’il y a des demandes je peux faire la mise à jour

Quel est le but de ce billet ?

Ce billet me sert d’aide-mémoire pour tout centraliser, car il m’a fallut parcourir un nombre considérable de pages pour y arriver.

J’espère que cela fera gagner du temps à quelqu’un d’autre…

Vous pouvez me laisser un pourboire si vous le voulez, merci d’avance :)

Note: Ce billet est en perpétuelle évolution. Seule la partie installation de base est terminée.

Je vais décrire les étapes nécessaires pour obtenir le système suivant:

  • Système en dual-boot Arch Linux / Mac OS X
  • Boot manager UEFI Gummiboot (simple et possibilité de gérer facilement plusieurs noyaux)
  • SSD totalement chiffré (Mac OS X et Arch Linux)
  • Utilisation de LVM
  • Hibernation (suspend to disk) dans un fichier swap
  • Paramètres pour une autonomie maximale (~09h30)

J’ai choisi de garder Mac OS X afin de pouvoir continuer à faire les mises à jour de firmware.

Attention: ne recopiez pas les commandes sans réfléchir, en particulier les devices /dev/sd* propres à chaque installation. Vous pouvez perdre des données.

Le MacBook utilisé

Après des semaines d’errance à chercher un remplaçant à mon vieux Thinkpad T43, et constaté que le prix des MacBook n’est pas (plus ?) si délirant au vu des composants et de la qualité d’assemblage, j’en ai acheté un sur le refurb d’Apple à 1279€.

J’ai pris le parti de prendre le maximum de ram possible (16Go), car elle est soudée et non-évolutive, et de faire un compromis sur la taille du SSD pour rester à un prix raisonnable.

Il ne reste plus qu’à attendre quelques mois la sortie de SSD compatibles, car il est possible de les changer soi-même: MacBook Pro 13” Retina Display Mid 2014 SSD Replacement

Caractéristiques:

  • MacBook Pro Retina 13” mi-2014 (modèle MacBookPro11,1)
  • Intel Core I7 3Ghz
  • 16 Go Ram
  • 128 Go de stockage Flash
  • Carte graphique Intel Iris, 1536 Mo vram
  • Ecran Retina 13,3” 2560x1600
  • Caméra FaceTime HD 720p

Sortie de lspci:

00:00.0 Host bridge: Intel Corporation Haswell-ULT DRAM Controller (rev 09)
00:02.0 VGA compatible controller: Intel Corporation Device 0a2e (rev 09)
00:03.0 Audio device: Intel Corporation Haswell-ULT HD Audio Controller (rev 09)
00:14.0 USB controller: Intel Corporation 8 Series USB xHCI HC (rev 04)
00:16.0 Communication controller: Intel Corporation 8 Series HECI #0 (rev 04)
00:1b.0 Audio device: Intel Corporation 8 Series HD Audio Controller (rev 04)
00:1c.0 PCI bridge: Intel Corporation 8 Series PCI Express Root Port 1 (rev e4)
00:1c.1 PCI bridge: Intel Corporation 8 Series PCI Express Root Port 2 (rev e4)
00:1c.2 PCI bridge: Intel Corporation 8 Series PCI Express Root Port 3 (rev e4)
00:1c.4 PCI bridge: Intel Corporation 8 Series PCI Express Root Port 5 (rev e4)
00:1c.5 PCI bridge: Intel Corporation 8 Series PCI Express Root Port 6 (rev e4)
00:1f.0 ISA bridge: Intel Corporation 8 Series LPC Controller (rev 04)
00:1f.3 SMBus: Intel Corporation 8 Series SMBus Controller (rev 04)
02:00.0 Multimedia controller: Broadcom Corporation Device 1570
03:00.0 Network controller: Broadcom Corporation BCM4360 802.11ac Wireless Network Adapter (rev 03)
04:00.0 SATA controller: Marvell Technology Group Ltd. 88SS9183 PCIe SSD Controller (rev 14)

Installation de base

Backup préalable

Comme je ne connais pas du tout l’univers Mac ni UEFI, à peine déballé, je fais un dump complet du SSD pour parer à toute fausse manipulation (il n’y a pas de DVD de restauration).

Le backup est fait simplement sur un disque externe USB, en démarrant le Mac sur une clé usb bootable Arch Linux, puis en copiant entièrement le SSD avec la commande dd:

  • Préparer une clé USB Arch Linux bootable
  • Démarrer sur le boot manager UEFI (maintenir la touche alt droite enfoncée)
  • Brancher un disque dur usb, le monter et y dumper le SSD /dev/sda à l’aide de la commande dd
  • Rebooter sous Mac OS X et faire les mises à jour.

Mac OS X: partitionnement et chiffrement

Lancer l’utilitaire disque (diskutil) pour réduire la seule partition existante. Je l’ai réduite à 40Go, ce qui laisse 10Go de libre sur la partition, et 81Go pour Arch Linux.

Activer ensuite le chiffrement FileVault en allant dans Préférences Système -> Sécurité et confidentialité –> FileVault

La partition Mac OS X est à présent chiffrée, et de la place a été libérée pour Arch Linux.

Un lien bien utile si vous n’arrivez plus à redimensionner la partition sur laquelle est installé Mac OS X (les histoires de Core Storage vs HFS+)

Documentation officielle de FileVault

Clé USB bootable Arch Linux

Sa création est simple:

wget http://archlinux.mirrors.ovh.net/archlinux/iso/2015.01.01/archlinux-2015.01.01-dual.iso
dd if=archlinux-2015.01.01-dual.iso of=/dev/xx bs=4M

Le démarrage sur la clé se fait en restant appuyé sur la touche alt droite puis en choisissant l’entrée EFI boot

Pour avoir une police un peu plus lisible et un clavier français:

setfont sun12x22
loadkeys fr

Accès au réseau

L’accès Internet étant indispensable pour l’installation, il y a plusieurs possibilités:

  • Partage de connexion via USB tethering
  • Wifi
  • Adaptateur ethernet Thunderbolt

N’ayant pas d’adaptateur Thunderbold, je vais expliquer les 2 autres solutions, qui sont à effectuer avant de lancer l’installation (pacstrap, …)

USB tethering

La plus simple, tout est expliqué dans la page wiki Arch Linux. Testé avec succès avec un Samsung Ace2.

Wifi

La carte wifi (pci 14e4:43a0 rev 03) nécessite le pilote propriétaire Broadcom, fourni par le package broadcom-wl

Pour créer le paquet le plus simple est d’avoir sous la main une autre Arch Linux avec le même noyau que l’iso d’installation (3.17.6-1-ARCH):

Préparation du package:

 $ wget https://aur.archlinux.org/packages/br/broadcom-wl/broadcom-wl.tar.gz
 $ tar xf broadcom-wl.tar.gz
 $ cd broadcom-wl/
 $ makepkg -s

J’obtiens le paquet broadcom-wl-6.30.223.248-4-x86_64.pkg.tar.xz que je copie sur une seconde clé usb, qui une fois le système live démarré sera montée et le package installé:

mkdir /tmp/usb
mount /dev/sdd1 /tmp/usb
pacman -U /tmp/usb/broadcom-wl-6.30.223.248-4-x86_64.pkg.tar.xz

Si vous n’avez qu’une seule clé USB de disponible, il est possible d’intégrer directement ce fichier à la clé bootable.

Après l’installation du paquet dans le système live, on charge les modules nécessaires pour se connecter à un réseau WPA2 (une interface wlp3s0 va apparaître):

modprobe wl lib80211_crypt_tkip

Puis connexion au réseau avec la commande wifi-menu

Partitionnement Arch Linux

Je ne vais créer qu’une seule partition supplémentaire, qui sera chiffrée et servira de physical volume à LVM, lequel pourra contenir autant de volumes logiques que nécessaire.

Pas besoin non plus de partition dédiée à /boot, car le boot manager utilisé Gummiboot peut lire directement les noyaux/initramfs stockés dans la partition ESP existante (habituellement /dev/sda1)

Le disque utilisant GPT, il faut utiliser cgdisk au lieu de fdisk/cfdisk.

cgdisk /dev/sda

Voici la table des partitions actuelle:

Part. #    Size        Partition Type      Partition Name
-------------------------------------------------------
          3.0 KiB      free space
1         200.0 MiB    EFI System          EFI System Partition
2         37.3 GiB     Apple Core Storage  Macintosh HD
3         619.9 MiB    Apple Boot          Recovery HD
          74.9 GiB     free space

Il y a sur les différents forums un débat sur la nécessité de devoir laisser ou non 128MiB entre les partitions. Après recherche, il s’avère que c’est en anticipation d’éventuels changements dans la table des partitions:

Note: We leave free space after each partition to make it easier for future system software to manipulate the partition map in ways that we can’t anticipate currently.

Si vous voulez créer cet espace, il suffit de taper +128M quand cgdisk demande l’offset du début de la partition.

Libre à vous d’interpréter cela et de créer ou non cet espace. Personnellement j’ai créé ma partition directement à la suite, avec le label archlinux, et tout fonctionne très bien, y compris Mac OS X.

Table des partitions finale:

Part. #    Size        Partition Type      Partition Name
-------------------------------------------------------
          3.0 KiB      free space
1         200.0 MiB    EFI System           EFI System Partition
2         37.3 GiB     Apple Core Storage   Macintosh HD
3         619.9 MiB    Apple Boot           Recovery HD
4         74.9 GiB     Linux filesystem     archlinux

DM-Crypt et LVM

La partition /dev/sda4 sera chiffrée avec DM-Crypt et LVM sera utilisé au-dessus (LVM on LUKS). Voir la page wiki pour les avantages et inconvénients.

Quelques liens pour vous aider à choisir les algorithmes.

Je choisis la combinaison la plus rapide donnée par cryptsetup benchmark, mon objectif est d’éviter qu’en cas de perte mes données soient facilement lisibles, pas de résister à toutes les attaques du monde.

Si vous vous posez la question du surcoût induit par le chiffrement, voici un bench rassurant sur le sujet.

Pour ce que je compte utiliser (ext4 et dmcrypt), le surcoût est négligeable.

# Tests approximatifs en utilisant uniquement la mémoire (pas de stockage E/S).
PBKDF2-sha1      1233618 iterations per second
PBKDF2-sha256     824352 iterations per second
PBKDF2-sha512     627138 iterations per second
PBKDF2-ripemd160  734296 iterations per second
PBKDF2-whirlpool  270251 iterations per second
#  Algorithm | Key |  Encryption |  Decryption
     aes-cbc   128b   679,8 MiB/s  2933,1 MiB/s
 serpent-cbc   128b    89,1 MiB/s   582,5 MiB/s
 twofish-cbc   128b   190,5 MiB/s   370,5 MiB/s
     aes-cbc   256b   501,4 MiB/s  2244,5 MiB/s
 serpent-cbc   256b    89,9 MiB/s   582,2 MiB/s
 twofish-cbc   256b   192,0 MiB/s   370,3 MiB/s
     aes-xts   256b  2548,1 MiB/s  2539,2 MiB/s
 serpent-xts   256b   582,2 MiB/s   564,1 MiB/s
 twofish-xts   256b   359,5 MiB/s   365,8 MiB/s
     aes-xts   512b  1956,8 MiB/s  1951,9 MiB/s
 serpent-xts   512b   582,7 MiB/s   563,9 MiB/s
 twofish-xts   512b   359,7 MiB/s   365,2 MiB/s

Chiffrement de la partition unique:

$ cryptsetup -v --cipher aes-xts-plain64 --key-size 256 -y luksFormat /dev/sda4

Note: j’ai eu besoin de lancer partprobe pour que la nouvelle partition /dev/sda4 soit visible.

Ouverture du device, création des volumes physiques, groupes et volumes logiques LVM et du filesystem ext4 pour / (qui est la seule partition):

$ cryptsetup luksOpen /dev/sda4 lvm
$ pvcreate /dev/mapper/lvm
$ vgcreate vgcrypt /dev/mapper/lvm
$ lvcreate --extentes +100%FREE -n root vgcrypt
$ mkfs.ext4 /dev/mapper/vgcrypt-root

Montage des partitions avant de lancer l’installation:

$ mount /dev/mapper/vgcrypt-root /mnt
$ mkdir /mnt/boot
$ mount /dev/sda1 /mnt/boot

Installation du système de base, création de /etc/fstab, et ajout de l’option discard car c’est un SSD:

$ pacstrap /mnt base base-devel
$ genfstab -L -p /mnt >> /mnt/etc/fstab

# /etc/fstab
/dev/mapper/vgcrypt-root	/      	ext4     	discard,rw,relatime,data=ordered	0 1

Installation du pilote pour la carte wifi et des packages pour se connecter en wifi une fois le nouveau système installé (copié depuis la 2ème clé USB):

$ cp /tmp/usb/broadcom-wl-6.30.223.248-4-x86_64.pkg.tar.xz /mnt/root/
$ arch-chroot /mnt
$ pacman -U /root/broadcom-wl-6.30.223.248-4-x86_64.pkg.tar.xz
$ pacman -Sy wpa_supplicant dialog

Etapes habituelles figurant dans la doc, arrêtez-vous avant l’installation du bootloader.

echo myhostname > /etc/hostname

ln -sf /usr/share/zoneinfo/Europe/Paris /etc/localtime

vi /etc/locale.gen
locale-gen

echo LANG=fr_FR.UTF-8 > /etc/locale.conf

# /etc/vconsole.conf
KEYMAP=fr-latin1
FONT=sun12x22

Modification de /etc/mkinitcpio.conf pour prendre en compte le chiffrement et LVM:

HOOKS="base udev autodetect modconf block consolefont keymap keyboard encrypt lvm2 filesystems fsck"

Le rôle de chaque hook est décrit ici

Génération de l’initramfs:

$ mkinitcpio -p linux

Boot manager Gummiboot

Le menu de démarrage est simple et sans fioritures, je n’en demande pas plus:

Gummiboot menu

Installation, écriture du fichier des options par défaut:

$ pacman -S gummiboot
$ mkdir -p /boot/loader/entries

# /boot/loader/loader.conf
default arch
timeout 4

Pour rappel la partition ESP /dev/sda1 est directement montée dans le /boot de l’installation, soit /mnt/boot

$ findmnt /boot/
TARGET SOURCE    FSTYPE OPTIONS
/boot  systemd-1 autofs rw,relatime,fd=24,pgrp=1,timeout=300,minproto=5,maxproto=5,direct
/boot  /dev/sda1 vfat   rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro

# Contenu final
$ tree /boot/
/boot/
├── EFI
│   ├── APPLE
│   │   └── EXTENSIONS
│   │       └── Firmware.scap
│   ├── Boot
│   │   └── BOOTX64.EFI
│   └── gummiboot
│       └── gummibootx64.efi
├── initramfs-linux-fallback.img
├── initramfs-linux.img
├── loader
│   ├── entries
│   │   └── arch.conf
│   └── loader.conf
└── vmlinuz-linux

Ajout d’une entrée pour notre installation d’Arch Linux:

# /boot/loader/entries/arch.conf

title        Arch Linux
linux       /vmlinuz-linux
initrd      /initramfs-linux.img
options     cryptdevice=/dev/sda4:vgcrypt root=/dev/mapper/vgcrypt-root rw

Explications:

  • Les chemins sont relatifs à /boot/
  • options cryptdevice=/dev/sda4:vgcrypt root=/dev/mapper/vgcrypt-root rw
    • /dev/sda4 est la partition chiffrée contenant le PV lvm
    • vgcrypt est le volume group LVM
    • root=/dev/mapper/vgcrypt-root est le volume logique LVM contenant mon /
    • rw Mount root device read-write on boot

Plus d’informations sur la ligne options ici

Première installation de Gummiboot

$ gummiboot install

L’installation de base est terminée !

Après avoir redémarré, le menu de Gummiboot doit apparaitre, puis le mot de passe pour le volume chiffré sera demandé.

Le temps de personnaliser le système, le wifi doit fonctionner avec la commande wifi-menu, il peut être intéressant de remplacer le package broadcom-wl par broadcom-wl-dkms si vous utilisez un noyau custom.

Suspend to disk (Uswsusp)

D’abord un comparatif des différents frameworks d’hibernation. Je vais utiliser Uswsusp car il gère les fichiers de swap (en plus des partitions de swap)

Installation du package uswsusp-git:

aurget -S swsusp-git

Création d’un fichier de swap de 8 GiB (je compte sur l’aide de la compression):

$ fallocate -l 8G /swapfile
$ chmod 600 /swapfile
$ mkswap /swapfile

Ajout à /etc/fstab, tuning VM pour utiliser le swap au minimum (j’ai 16 GiB de ram…) puis activation:

# /etc/fstab
/swapfile   swap    swap    defaults        0       0
# /etc/sysctl.d/99-disable-swapfile.conf
vm.swappiness=1
$ swapon -a

A l’installation du paquet uswusp-git on apprends des choses intéressantes que l’on va appliquer:

==> The new Software Suspend does not use kernel parameters
==> to determine the suspend partition, instead it consults
==> /etc/suspend.conf when booting.
==> You MUST edit this file before you update your initrd.
==> Point the "resume device" variable to your swap partition.
==> You will need to update your mkinitcpio.conf file to
==> include the hook uresume.  Replace your 'resume' hook
==> with 'uresume'.  If you do not have a resume hook the
==> uresume hook must go before filesystems but after block.
==> Do not get this wrong.  Then rebuild the ramdisk with
==> '# mkinitcpio -p linux' (or what else needed for the
==> kernel you use)

Récupération de l’offset du fichier de swap:

$ swap-offset /swapfile
resume offset = 149504

Edition du fichier de configuration:

# /etc/suspend.conf

snapshot device = /dev/snapshot
resume device = /dev/mapper/vgcrypt-root
resume offset = 149504  # offset of /swapfile
image size = 8589934592 # size of /swapfile
compress = y
splash = n
resume pause = 5 # 5s le temps de lire les stats concernant l'image
threads = y

Ajout du hook uresume après encrypt, lvm2 et avant filesystems (l’ordre est important):

# /etc/mkinitcpio.conf

HOOKS="base udev autodetect modconf block consolefont keymap encrypt lvm2 uresume filesystems keyboard fsck"

Mise à jour de l’initramfs:

$ mkinitcpio -p linux

Désormais le MacBook peut être mis en hibernation avec la commande s2disk. Pour la mise en veille il suffit de fermer l’écran (ou avec la commande s2ram)

Post-installation

Juste quelque notes, car beaucoup de choses sont déjà documentées dans la page MacBook dédiée à ce modèle.

Economie d’énergie

Avec ces réglages j’arrive à une autonomie théorique de 09h30, ce qui n’est vraiment pas loin de Mac OS X.

Powertop

Appliquer automatiquement au démarrage tous les paramètres optimaux (GOOD dans l’onglet tunables).

Créer une nouvelle unité Systemd:

# /etc/systemd/system/powertop.service

[Unit]
Description=Powertop tunings

[Service]
Type=oneshot
ExecStart=/usr/bin/powertop --auto-tune

[Install]
WantedBy=multi-user.target

Activation à chaque démarrage:

$ systemctl enable powertop.service

Chipset graphique

Options du module i915

Fichier /etc/modprobe.d/i915.conf

options i915 enable_rc6=1 enable_fbc=1 lvds_downclock=1

Plus d’informations sur les différents états visibles dans Powertop ici

Warning: ces options peuvent poser problème avec l’hibernation (pas de X au retour de l’hibernation)

Chipset audio Intel

/etc/modprobe.d/snd_hda_intel.conf

options snd_hda_intel power_save=1

USB

/etc/modprobe.d/usbcore.conf

options usbcore autosuspend=1

Clavier: touches spéciales

  • Luminosité écran
  • Eclairage clavier
  • Son

Avec xbindkeys et le fichier ~/.xbindkeysrc

# Nécessite les package xbacklight et kbdlight (AUR)

"amixer set Master playback 5%+"
    XF86AudioRaiseVolume

"amixer set Master playback 5%-"
    XF86AudioLowerVolume

"amixer set Master toggle"
    XF86AudioMute

"xbacklight -dec 10"
  XF86MonBrightnessDown

"xbacklight -inc 10"
  XF86MonBrightnessUp

"kbdlight up"
  XF86KbdBrightnessUp

"kbdlight down"
  XF86KbdBrightnessDown

xbindkeys devra être lancé au démarrage de votre session graphique (.xinitrc, …)

Note: Il est possible d’ajuster automatiquement la luminosité du clavier et/ou de l’écran en utilisant le capteur de luminosité du MacBook, avec lighter ou lightum

Touchpad

Il existe un autre pilote plus avancé que synaptics, xf86-input-mtrack

Installation:

aurget -S xf86-input-mtrack.git

Tous les paramètres sont décrits dans le README du projet, voici ceux que j’utilise:

#  /etc/X11/xorg.conf.d/60-mtrack.conf

Section "InputClass"
  Identifier "touchpad"
  Driver "mtrack"
  MatchIsTouchpad "on"
  MatchDevicePath "/dev/input/event*"
  Option "Sensitivity" "0.65"
  Option "TapButton1" "0"
  Option "TapButton2" "2"
  Option "TapButton3" "0"
  Option "TapButton4" "0"
  Option "ClickFinger1" "1"
  Option "ClickFinger2" "0"
  Option "ClickFinger3" "0"
  Option "ButtonMoveEmulate" "false"
  Option "FingerHigh" "10"
  Option "FingerLow" "1"
  Option "IgnoreThumb" "true"
  Option "IgnorePalm" "true"
  Option "TapDragEnable" "false"
EndSection

Problèmes rencontrés

Ces problèmes sont apparus durant l’installation initiale (archlinux-2015.01.01-dual.iso, noyau 3.17.6-1-ARCH), vous ne les aurez peut-être pas avec des versions plus récentes ou un MacBook différent.

La police console est partiellement appliquée

Malgré la configuration dans /etc/vconsole.conf, la police redevient minuscule au moment du login (mais était lisible lors de la saisie du mot de passe DM-Crypt)

Cela est dû au kernel mode setting, il faut charger le module i915 au plus tôt.

Pour cela, rajouter i915 dans la liste MODULES de /etc/mkinitcpio.conf:

MODULES="i915"

Puis régénérez l’initramfs.

Utilisation CPU élevée

Détecté rapidement par un MacBook chaud sans raison particulière, et une autonomie très basse (~2h30).

On peut voir un thread noyau kworker utiliser énormement de CPU:

  PID UTIL.     PR  NI    VIRT    RES  %CPU %MEM    TEMPS+ S COM.
   39 root      20   0    0,0m   0,0m  70,7  0,0   0:55.59 R kworker/0:2

Et dans powertop beaucoup d’interruptions relatives à acpi:

                Usage       Events/s    Category       Description
             75,6 ms/s     6655,9       Interrupt      [9] acpi
             86,3 ms/s     4627,4       kWork          acpi_os_execute_deferred

Solution: echo "disable" > /sys/firmware/acpi/interrupts/gpe66

Unité systemd pour lancer cela à chaque démarrage:

# /etc/systemd/system/suppress-gpe66.service

[Unit]
Description=Disables GPE 66, an interrupt that is going crazy on Macs

[Service]
ExecStart=/usr/bin/bash -c 'echo "disable" > /sys/firmware/acpi/interrupts/gpe66'

[Install]
WantedBy=multi-user.target

Activation:

systemctl enable suppress-gpe66.service

Source

Erreurs ata

Messages apparaissant dans dmesg :

[  527.246778] ata1: exception Emask 0x10 SAct 0x0 SErr 0x10000 action 0xe frozen
[  527.246839] ata1: irq_stat 0x00400000, PHY RDY changed
[  527.246876] ata1: SError: { PHYRdyChg }
[  527.246906] ata1: hard resetting link
[  527.963651] ata1: SATA link up 6.0 Gbps (SStatus 133 SControl 300)
[  527.964126] ata1.00: unexpected _GTF length (8)
[  527.964803] ata1.00: unexpected _GTF length (8)
[  527.964926] ata1.00: configured for UDMA/133
[  527.965030] ata1: EH complete

Je n’ai pas encore trouvé de cas où cela est gênant.

Sortie son HDMI par défaut

J’utilise Alsa, et la carte reconnue par défaut est la sortie son HDMI et non la carte son Intel (chez moi Cirrus Logic CS4208).

Pour inverser ce comportement l’option index=1,0 doit être passée au module noyau snd-hda-intel:

# /etc/modprobe.d/snd_hda_intel.conf

options snd-hda-intel index=1,0

Divers

i3-wm: verrouiller l’écran au retour de mise en veille

J’utilise i3lock, il suffit de créer une nouvelle unité systemd qui le lance juste avant la mise en veille:

# /etc/systemd/system/i3lock.service

[Unit]
Description=i3lock
Before=sleep.target

[Service]
User=%I
Type=forking
Environment=DISPLAY=:0
ExecStart=/usr/bin/i3lock -c 000000

[Install]
WantedBy=sleep.target

Activation:

systemctl enable i3lock.service

Firefox et l’affichage Rétina

L’installation de l’extension AutoDiDPI permet de mettre à l’échelle correctement les polices affichées.