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:
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
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
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
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.