FreeBSD sur le Lenovo Thinkpad T480
Dernière mise à jour : le 6 janvier, 2023
J'ai récemment remplacé mon MacBook Air 2014 par un Lenovo Thinkpad T480, sur lequel j'ai installé FreeBSD, présentement 13.0-RELEASE. Cette page vise à documenter ma configuration et des problèmes que j'ai résolus.
Ce qui fonctionne:
- Écran WQHD (HiDPI)
- WiFi (802.11g)
- Caméras (lumière visible et infrarouge)
- Mise en veille et réveil
- Audio (voir section sur la prise casque)
- Pavé tactile & TrackPoint
- Ports USB
- Bluetooth (voir article détaillé) (N.B. cause des problèmes avec la suspension/reprise)
Ce qui ne fonctionne pas: 802.11ac (toujours pas implémenté dans FreeBSD). Je n'ai pas de périphérique Thunderbolt pour tester et je n'ai pas de capteur d'empreinte digitale installé.
X11 (Xorg) et Intel Graphics
Pour utiliser l'interface Intel intégrée avec Xorg, il faut installer les pilotes du paquet drm-fbsd12.0-kmod
(métapaquet drm-kmod
). J'ai eu plus de succès en les compilant avec ports qu'en les installant avec pkg (par exemple, avec la mise à jour de 12.0-RELEASE à 12.1-RELEASE). Après l'installation, ajouter
kld_list="/boot/modules/i915kms.ko"
à /etc/rc.conf
pour les charger au démarrage.
Pour Xorg, je préfère le pilote xf86-video-intel
. Le pilote par défaut modesetting
souffre d'une mauvaise synchronisation verticale ('screen tearing'). Après d'installer xf86-video-intel
, il est mieux d'utiliser l'option d'accélération SNA (l'alternatif, UXA, est très lent). J'utilise la configuration suivante dans /usr/local/etc/X11/xorg.d.conf/
:
# /usr/local/etc/X11/xorg.conf.d/20-intel.conf
Section "Device"
Identifier "Intel Graphics"
Driver "intel"
Option "AccelMethod" "SNA"
Option "TearFree" "true"
EndSection
Pavé tactile & TrackPoint
Depuis que udev/libinput a été intégré dans la configuration par défaut de xorg-server
, c'est plus facile qu'avant de configurer le pavé tactile. Ma configuration est inspirée par un article par Michael Gmelin.
J'ajoute que si kern.evdev.rcpt_mask
est mis à 12 plutôt qu'à 6 (comme suggéré par le paquet xorg-server
), j'ai trouvé qu'un plus grand nombre de touches sont disponibles dans Xorg pour être configurés comme raccourcis.
Pour configurer le pavé tactile, les boutons et le TrackPad, j'utilise la configuration suivante dans /usr/local/etc/X11/xorg.conf.d/10-input.conf
:
Section "InputClass"
Identifier "libinput keyboard catchall"
MatchIsKeyboard "on"
MatchDevicePath "/dev/input/event*"
Driver "libinput"
Option "XkbRules" "evdev"
EndSection
Section "InputClass"
Identifier "libinput touchpad catchall"
MatchIsTouchpad "on"
MatchDevicePath "/dev/input/event*"
Driver "libinput"
Option "NaturalScrolling" "on"
Option "Tapping" "on"
Option "DisableWhileTyping" "on"
Option "AccelSpeed" "0.42"
EndSection
Réseaux WiFi bande 5GHz
Les réseaux WiFi sur la bande 5 GHz ne seront pas visibles à moins que le code pays soit défini pour l'interface. Je mis la ligne suivante dans /etc/rc.conf
pour le configurer (dans ce cas, pour Canada) :
ifconfig_wlan0="WPA country CA powersave"
La connectivité WiFi est aussi limitée aux vitesses de 802.11g pour la carte sans fil Intel 8265. J'ai tenté d'utiliser le PCI passthrough avec une machine virtuelle Linux sur bhyve pour accéder aux vitesses 802.11ac, mais tout cela ne fonctionne toujours pas avec la mise en veille.
Mise en veille et réveil
Pour activer la mise en veille en fermant l'ordinateur, ajouter hw.acpi.lid_switch_state=S3
à /etc/sysctl.conf
.
Pour que la mise en veille fonctionne, il faut désactiver la puce TPM dans le BIOS. Les puces TPM prises en charge sont énumérées dans man tpm
et il semble que celle du T480 n'est pas supportée. Selon le manuel, la puce TPM doit sauvegarder ses renseignements avant de la mise en veille, faute de quoi celle-ci échouera.
Luminosité de l'écran
J'utilise acpi_video
, voir mon article détaillé sur comment contrôler la luminosité.
Audio
Avec 12.2-RELEASE, il n'y a pas de problème avec le son.
Sur 12.1-RELEASE, l'audio est bon sur les haut-parleurs, mais terrible sur la prise casque, plein de bruit et de distorsion. Dès mars 2020, ce problème n'est pas présent dans 12.1-STABLE ou 13.0-CURRENT (je suppose que ça a été résolu dans r351325). Pour une résolution provisoire, j'ai téléchargé la code source pour le pilote hda
de la branche stable (stable/12/sys/dev/sound/pci/hda/
) au dossier correspondant dans /usr/src
. J'ai ensuite récompilé le noyau et ses modules. Jusqu'à ce que ces modifications soient intégrées dans la branche RELEASE, cette procédure règle le problème.
Caméra
La caméra infrarouge est la seule option offerte avec l'écran WQHD. La configuration par défaut de webcamd
n'active que la caméra infrarouge, pas celle de lumière visible!
usbconfig
montre les deux caméras :
ugen0.2: <Bison Integrated IR Camera> at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE (500mA)
ugen0.3: <SunplusIT Inc Integrated Camera> at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE (500mA)
Pour utiliser la caméra de lumière visible, il faut définir webcamd_0_flags
dans /etc/rc.conf
pour spécifier lequel appareil utiliser, par exemple webcamd_enable="YES"
webcamd_0_flags="-d ugen0.3 -B"
Alternativement, les deux caméras peuvent être configurées (voir /etc/rc.conf
ci-dessous).
Pour utiliser la caméra dans Firefox, j'ai dû ajouter mon utilisateur au groupe webcamd
ainsi qu'installer v4l-utils
et v4l_compat
.
Gestionnaire de fenêtre (i3) et problèmes HiDPI
Pour supporter une résolution HiDPI, le facteur d'échelle doit être défini avec xrandr. Je le fais dans .xinitrc
:
xrandr --dpi 140 && xrdb -merge $HOME/.Xresources
exec i3 # start the window manager
Pour i3wm, la configuration générée est plus limitée que celle sans fichier de configuration (d'exécution). Je suggère de copier le fichier par défaut comme un point de départ :
mkdir -p ~/.i3 && cp /usr/local/etc/i3/config ~/.i3/config
Pour augmenter la taille du curseur, il faut spécifier un thème comportant plusieurs tailles de curseur dans .Xresources
:
Xcursor.size: 48
Xcursor.theme: whiteglass
Cependant, j'ai dû ajouter une liaison symbolique pour que cela fonctionnait :
ln -s /usr/local/share/icons ~/.icons
Il pourrait être nécessaire de définir le même thème pour des applications GTK (Firefox, xfce4-terminal) dans ~/.config/gtk-3.0/settings.ini
et ~/.gtkrc-2.0
.
Pour utiliser un moniteur externe avec une densité en pixels différente (par exemple, de 96 ppi) calculer premièrment le quotient des densités en pixels du moniteur hidpi / moniteur externe
(dans mon cas, 140 / 96 = 1,485). Le moniteur externe peut être configuré avec cette résolution avec une commande comme :
xrandr --output "HDMI-2" --mode 1920x1080 --scale 1.485x1.485 --right-of "eDP-1"
Il se peut que le curseur ne puisse pas accéder à tout l'aire du moniteur externe, ce qui semble être un bogue connu dont je n'ai pas toujours trouvé de résolution.
Fichiers de configuration
/etc/rc.conf
#
# Added by installer
#
clear_tmp_enable="YES"
syslogd_flags="-ss"
sendmail_enable="NONE"
hostname="t480"
ntpdate_enable="YES"
ntpd_enable="YES"
# Set dumpdev to "AUTO" to enable crash dumps, "NO" to disable
dumpdev="AUTO"
zfs_enable="YES"
# Power saving, see https://www.c0ffee.net/blog/freebsd-on-a-laptop/
powerdxx_enable="YES"
performance_cx_lowest="Cmax"
economy_cx_lowest="Cmax"
# Intel Graphics driver
kld_list="/boot/modules/i915kms.ko"
# Readable font size at console
allscreens_flags="-f terminus-b32"
# For XOrg
dbus_enable="YES"
# Don't pause during boot for DHCP
background_dhclient="YES"
# Networking; use ethernet if available, otherwise use WiFi
# https://www.freebsd.org/doc/handbook/network-aggregation.html
ifconfig_em0="up"
wlans_iwm0="wlan0"
ifconfig_wlan0="WPA country CA powersave"
create_args_wlan0="wlanaddr 98:fa:9b:6c:e4:4f"
# Same as em0 MAC address
cloned_interfaces="lagg0"
ifconfig_lagg0="up laggproto failover laggport em0 laggport wlan0 DHCP"
# Webcam
webcamd_enable="YES"
webcamd_0_flags="-d ugen0.3" # visible light camera
webcamd_1_flags="-d ugen0.2" # IR camera
# CUPS (allow printing)
cupsd_enable="YES"
/etc/sysctl.conf
# Added by the installer
security.bsd.unprivileged_read_msgbuf=0
security.bsd.unprivileged_proc_debug=0
kern.randompid=1
vfs.zfs.min_auto_ashift=12
# Allow sleep on lid close
hw.acpi.lid_switch_state=S3
# Disable system bell / bell everywhere
kern.vt.enable_bell=0
# Allow mounting FUSE filesystems
vfs.usermount=1
/boot/loader.conf
# Added by installer
aesni_load="YES"
geom_eli_load="YES"
security.bsd.allow_destructive_dtrace=0
kern.geom.label.disk_ident.enable="0"
kern.geom.label.gptid.enable="0"
zfs_load="YES"
# Improved power and video support
acpi_ibm_load="YES"
# For webcam
cuse_load="YES"
# WiFi
if_iwm_load="YES"
iwm8265fw_load="YES"
# Touchpad driver
hw.psm.synaptics_support="1"
# FUSE
fusefs_load="YES"
# Place devices in low power state when suitable driver not found
# (man 4 pci)
hw.pci.do_power_nodriver=3