Inleiding
Dezer dagen kreeg ik een laptop op leeftijd als patiënt onder handen: een Lenovo IdeaPad G700 uit 2015. Hij was nog helemaal origineel; met accu van 9 jaar oud, een traditionele harde schijf en een besturingssysteem dat binnenkort niet meer wordt ondersteund. De eigenaar gaf mij toestemming om al die euvels te verhelpen.
Hardware
Een nieuwe accu was 1-2-3 geregeld via een welbekende webshop. Ook een vervanging voor de harde schijf (HDD) in de vorm van een veel snellere solid state drive (SSD) was zó in huis. Dankzij een filmpje op Youtube was het openen van de laptop en de daadwerkelijke upgrade een fluitje van een cent.
Toen ik het apparaat tóch open had, besloot ik ook maar meteen de CMOS-batterij te controleren. Met deze knoopcel onthoudt de computer zijn basis instellingen en de huidige datum-tijd. Ze bleek, ondanks haar leeftijd, nog netjes 3 Volt.
Besturingssysteem
De keuze voor GNU/Linux als besturingssysteem sprak voor zich, maar welke distributie zou het moeten worden? Zelf gebruik ik Fedora Workstation, maar de eigenaar was vooral op zoek naar een veilig en betrouwbaar systeem zonder veel toeters en bellen. Laat dat nou de voornaamste eigenschappen van Debian 12 ("Bookworm") zijn!
De installatie verliep vlotjes; ik koos voor de juiste taal (Nederlands), de juiste toetsenbordindeling (VS internationaal met dode toetsen) en richtte tot slot de gebruikersaccount in. Daarna volgde een aantal GNOME extensies zoals Dash to Dock en AppIndicator and KStatusNotifierItem Support.
Shell aanpassingen
De desktopomgeving mag best in het Nederlands. Datum-, tijd- en getalnotatie zijn zo in het verwachte formaat. Bijvoorbeeld dd-mm-jjjj voor het jaar, een 24-uurs klok en de komma als decimaal scheidingsteken. Daarnaast hebben de standaard mappen voor de gebruiker ook nederlandse namen ("Documenten", "Afbeeldingen", etc.).
Een nadeel van deze volledige localizatie is, dat in de terminal en tekstconsole
ook alle teksten en (fout-)meldingen in het Nederlands zijn. Dat is niet echt
handig bij het vragen van hulp; de voertaal op internet is nou eenmaal Engels. Om
in de terminal en tekstconsole de taal te wijzigen kun je gebruik maken van de
LANG
omgevingsvariabele, bijvoorbeeld met export LANG=C.UTF-8
in ~/.bashrc
.
In plaats van elke aanpassing aan ~/.bashrc
handmatig toe te voegen, kun je er
ook voor kiezen om de eigen aanpassingen in één of meerdere bestanden te
groeperen en deze samen in te lezen. Met dank aan Quentin ADAM voor de
tip. Daartoe voeg je eenmalig een stukje code toe. Daarna kun je met eigen
.bashrc
-bestanden je shell heel overzichtelijk naar wens maken:
# Make directory to contain custom .bashrc files
mkdir -p ~/.bashrc.d
chmod 700 ~/.bashrc.d
# Add command to execute all custom .bashrc files to existing ~/.bashrc
cat << EOF >> ~/.bashrc
# Execute custom .bashrc files
for file in ~/.bashrc.d/*.bashrc; do
source "$file";
done
EOF
# Create a custom .bashrc file to set default console language
cat << EOF > ~/.bashrc.d/custom.bashrc
# Set console language to C (English, locale independent)
export LANG=C.UTF-8
EOF
Wifi
Gedurende de hele installatie had ik de LAN-kabel aangesloten om niet tijdens de setup al met mijn 63 tekens tellend Wifi-wachtwoord te moeten goochelen. Toen ik na het installeren de WLAN functies ging testen, bleek er iets mis. Ik zag geen enkele mogelijkheid om een netwerk te kiezen. Het kopje 'Wifi' ontbrak zelfs volledig. En nu dan?
In de output van dmesg
en journalctl
werd veelvuldig melding gemaakt van
ontbrekende firmware voor de Broadcom BCM4314 wifi-chip. Zou er een stuurprogramma
ontbreken? Gelukkig had Debian een uitgebreide documentatie voor de installatie
van de kernel module genaamd wl
.
# Add non-free sources to system
sudo vim /etc/apt/sources.list
# ...
sudo apt update
# Install kernel headers and Broadcom DKMS package,
# build the new module named 'wl'
sudo apt-get install linux-image-$(uname -r|sed 's,[^-]*-[^-]*-,,') linux-headers-$(uname -r|sed 's,[^-]*-[^-]*-,,') broadcom-sta-dkms
# Remove any loaded conflicting kernel module
sudo modprobe -r b44 b43 b43legacy ssb brcmsmac bcma
# Load freshly built module 'wl'
sudo modprobe wl
Volgens de instructies zouden vanaf dat moment alle draadloze netwerken in de buurt zichtbaar moeten worden en zou NetworkManager het daarmee verbinden moeten aanbieden. Maar nee; het blokje 'wifi' ontbrak nog steeds. Een keertje opnieuw opstarten, onder het motto: "Wenn's nicht tut, hilft reboot"? Nee dus…
Secure Boot
Opnieuw schoot journalctl --follow
mij te hulp. Bij de poging om de module te
laden en zo wifi in te schakelen, bleek dat een bepaalde sleutel werd geweigerd:
modprobe: ERROR: could not insert 'wl': Key was rejected by service
Sleutels bij het laden van modules? Wacht eens even… Zou dit kunnen samenhangen met Secure Boot, een garantie dat alle geladen programmacode vertrouwd en legitiem is? Ik wist, dat hierbij gebruik wordt gemaakt van certificaten, ondertekeningen en, jawel, cryptografische sleutels.
Ik vond uiteindelijk Debians documentatie voor het ondertekenen van zelfgebouwde kernel modules:
# Check secure boot state (is it enabled?)
sudo mokutil --sb-state
# Check already enrolled keys
sudo mokutil --list-enrolled
# Create a folder to contain the new key
sudo mkdir -p /var/lib/shim-signed/mok/
cd /var/lib/shim-signed/mok/
# Generate a new key
sudo openssl req -nodes -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -days 36500 -subj "/CN=FWieP/"
sudo openssl x509 -inform der -in MOK.der -out MOK.pem
# Prepare the new key for enrolment (addition to the Secure Boot system)
# This will ask you to provide a one-time password
sudo mokutil --import /var/lib/shim-signed/mok/MOK.der
sudo reboot
Bij het herstarten vroeg de BIOS om het zojuist gekozen wachtwoord. Vervolgens werd de zelf gegenereerde sleutel aan het Secure Boot systeem toegevoegd.
# Check whether the new key was acutally enrolled (added)
sudo mokutil --test-key /var/lib/shim-signed/mok/MOK.der
# Add automatic signing to the DKMS build steps
cat << EOF | sudo tee -a /etc/dkms/framework.conf.d/fwiep-mok.conf
mok_signing_key="/var/lib/shim-signed/mok/MOK.priv"
mok_certificate="/var/lib/shim-signed/mok/MOK.der"
sign_tool="/etc/dkms/sign_helper.sh"
EOF
# Add DKMS signing helper script
cat << EOF | sudo tee -a /etc/dkms/sign_helper.sh
/lib/modules/"$1"/build/scripts/sign-file sha512 /root/.mok/client.priv /root/.mok/client.der "$2"
EOF
# Rebuild the module, from now on with automatic signature
sudo dpkg-reconfigure broadcom-sta-dkms
# Check whether the new module is signed with the correct key
sudo modinfo wl
Na nóg een keer opnieuw opstarten werd de wl
-module zonder problemen geladen
en werkte de wifi-functies eindelijk naar behoren. Uit nieuwsgierigheid wilde ik
weten hoe de Linux-kernel zichzelf zou bestempelen na deze lokale aanbouw. In
/proc/sys/kernel/tainted
stond de waarde 4097
. Met behulp van de
Linux kernel documentatie bleek deze bitwaarde te staan voor:
1 proprietary module was loaded
4096 externally-built ("out-of-tree") module was loaded
Bluetooth
In de output van journalctl
vond ik ook nog onderstaande meldingen. De
Bluetooth functie van de laptop bleek uitgeschakeld door het ontbreken van de
passende firmware.
kernel: Bluetooth: hci0: BCM: features 0x06
kernel: Bluetooth: hci0: BCM43142A
kernel: Bluetooth: hci0: BCM43142A0 (001.001.011) build 0000
kernel: bluetooth hci0: firmware: failed to load brcm/BCM43142A0-105b-e065.hcd (-2)
kernel: bluetooth hci0: firmware: failed to load brcm/BCM-105b-e065.hcd (-2)
kernel: Bluetooth: hci0: BCM: firmware Patch file not found, tried:
kernel: Bluetooth: hci0: BCM: 'brcm/BCM43142A0-105b-e065.hcd'
kernel: Bluetooth: hci0: BCM: 'brcm/BCM-105b-e065.hcd'
Met dank aan Azamat Hackimov en zijn project broadcom-bt-firmware kon ik
de Bluetooth functies toch werkend krijgen. Ik downloadde het meest recente
.deb
-bestand en installeerde het met sudo dpkg -i ...
. Nog één keer herstarten
en klaar.
Conclusie
Het voelt goed om een maatschappelijk afgeschreven apparaat een nieuw leven te kunnen geven. Door een relatief kleine financiële investering (circa € 90,-) en een paar uurtjes enthousiast stoeien kan deze 9-jaar oude laptop weer jaren mee.
Debian beschouwt zichzelf op deze machine als 'tainted' (besmet). Maar daardoor kan wel alle ingebouwde hardware worden gebruikt. Dat is een morele overweging die elke keer opnieuw mag worden gemaakt. Voor dit moment ben ik tevreden, en de eigenaar ook :).